Вход

Просмотр полной версии : Из массива вытащить одинаковые элементы и записать в другой массив.


Ruslan_Berebnev
12.11.2015, 18:25
Создаётся массив по событию. По этому же событию происходит выборка из ранее созданного массива, чтобы записать результат в другой массив, но на выходе всегда получается пустой массив. Почему?

//функция вытащит нужное значение массива и перезапишет его
function groupArray(arr, val) {
var object = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== val) continue;
object.push(arr[i]);
}
return object;
}

var objects, deleteAll, getName, obj = [];
//по событию создаётся массив, а потом используется выборка для создания
//ещё одного массива с одинаковыми значениями
deleteAll = function (e) {
if (e.target.className !== 'delete-all') return;
getName = e.target.parentElement.querySelector('.val-names').innerHTML;
for (var i = 1; i <= getCookie('COUNT'); i++) obj.push(getCookie('ITEM_NAME_' + i));
objects = groupArray(obj, getName);
console.log(objects); // результат []
}

window.addEventListener('click', deleteAll);

рони
12.11.2015, 18:56
getCookie('COUNT')
это число проверяли?

Ruslan_Berebnev
12.11.2015, 19:05
Да. Это сётчик. Он правильный.

Ruslan_Berebnev
12.11.2015, 19:06
.filter() тоже дал пустой массив. Не понимаю в чём дело. getName - строка, obj[i] - строка, строку со строкой сравниваю.

рони
12.11.2015, 19:10
Ruslan_Berebnev,
нужен полноценный макет

Mess4me
12.11.2015, 19:39
Ruslan_Berebnev, код без функций getCookie('COUNT') рабочий , так что проблема в этой функции

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>trigger demo</title>

</head>
<body>

<button class="delete-all">Button #1</button>
<div class="val-names">ITEM_NAME_2</div>

<script>
//функция вытащит нужное значение массива и перезапишет его
function groupArray(arr, val) {
var object = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== val) continue;
object.push(arr[i]);
}
return object;
}

var objects, deleteAll, getName, obj = [];
//по событию создаётся массив, а потом используется выборка для создания
//ещё одного массива с одинаковыми значениями
deleteAll = function (e) {
if (e.target.className !== 'delete-all') return;
getName = e.target.parentElement.querySelector('.val-names').innerHTML;
for (var i = 1; i <= 3; i++) obj.push( 'ITEM_NAME_' + i);
objects = groupArray(obj, getName);
alert(objects);
}

window.addEventListener('click', deleteAll);

</script>

</body>
</html>

рони
12.11.2015, 19:45
Mess4me,
а кнопочку посмотреть?

Mess4me
12.11.2015, 19:46
А как? :-?

Mess4me
12.11.2015, 19:47
Понял)

рони
12.11.2015, 19:57
Mess4me,
:victory:

Ruslan_Berebnev
12.11.2015, 20:11
Если в конце написать console.log(obj), то он выведет массив со значениями, которые как раз нужны. getCookie() точно работает. Но всё равно, вот его код.

function setCookie(name, value, options) {
options = options || {};

var expires = options.expires;

if (typeof expires == "number" && expires) {
var d = new Date();
d.setTime(d.getTime() + expires * 1000);
expires = options.expires = d;
}
if (expires && expires.toUTCString) {
options.expires = expires.toUTCString();
}

value = encodeURIComponent(value);

var updatedCookie = name + "=" + value;

for (var propName in options) {
updatedCookie += "; " + propName;
var propValue = options[propName];
if (propValue !== true) {
updatedCookie += "=" + propValue;
}
}

document.cookie = updatedCookie;
}

Ruslan_Berebnev
12.11.2015, 20:13
Вот полный скрипт

if (!navigator.cookieEnabled) {
alert('Включите cookie для комфортной работы с этим сайтом');
} else {
var arrQuantity = [], quantity = [];

function unique(arr) {
nextVal: for (var i = 0; i < arr.length; i++) {
var str = arr[i];
for (var j = 0; j < quantity.length; j++) {
if (quantity[j] == str) continue nextVal;
}
quantity.push(str);
}
return quantity;
}

function groupArray(arr, val) {
var object = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== val) continue;
object.push(arr[i]);
}
return object;
}

setInterval(function() {
for (var i = getCookie('COUNT'); i >= 1; i--) arrQuantity.push(getCookie('ITEM_NAME_' + i));
var qua = unique(arrQuantity).length;
qua > 0 ? $('#count-of-cookie').text('Количество наименований: ' + qua) :
$('#count-of-cookie').text('Количество наименований: 0');
}, 300);

var table, deleteAll, getName, obj = [];

table = document.querySelector('#table-item');

deleteAll = function (e) {
if (e.target.className !== 'delete-all') return;
getName = e.target.parentElement.querySelector('.val-names').innerHTML;
for (var i = 1; i <= getCookie('COUNT'); i++) obj.push(getCookie('ITEM_NAME_' + i));
console.log(obj);
}

//e.target.parentElement.innerHTML = '';
window.addEventListener('click', deleteAll);
}

Mess4me
12.11.2015, 20:17
Ruslan_Berebnev,
а функцию getCookie() можно посмотреть :) ?
Вы вставили setCookie

рони
12.11.2015, 20:19
Ruslan_Berebnev,
в коде нет установки 'COUNT'

Ruslan_Berebnev
13.11.2015, 11:15
Значение COUNT берётся из куков.

Ruslan_Berebnev
13.11.2015, 11:18
function getCookie(name) {
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}

Mess4me
13.11.2015, 11:48
Ruslan_Berebnev,
и при выполнении функции оно равно числу? Вы проверяли?

Ruslan_Berebnev
13.11.2015, 12:14
Да, это число. Я специально для этих целей использовал parseInt()

Mess4me
13.11.2015, 12:23
Ruslan_Berebnev,
попробуйте так :

//функция вытащит нужное значение массива и перезапишет его
function groupArray(arr, val) {
var object = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== val) continue;
object.push(arr[i]);
}
return object;
}

var objects, deleteAll, getName, obj = [];
//по событию создаётся массив, а потом используется выборка для создания
//ещё одного массива с одинаковыми значениями
deleteAll = function (e) {
if (e.target.className !== 'delete-all') return;
getName = e.target.parentElement.querySelector('.val-names').innerHTML;
for (var i = 1; i <= parseInt(getCookie('COUNT')); i++) obj.push(getCookie('ITEM_NAME_' + i));
objects = groupArray(obj, getName);
console.log(objects); // результат []
}

window.addEventListener('click', deleteAll);

Ruslan_Berebnev
13.11.2015, 12:27
Минут 30 назад так попробовал. Не получилось. Всё равно не могу понять почему не записывается в массив.
Вот мой последний не рабочий вариант.

if (!navigator.cookieEnabled) {
alert('Включите cookie для комфортной работы с этим сайтом');
} else {
var arrQuantity = [], quantity = [], count;

function unique(arr) {
nextVal: for (var i = 0; i < arr.length; i++) {
var str = arr[i];
for (var j = 0; j < quantity.length; j++) {
if (quantity[j] == str) continue nextVal;
}
quantity.push(str);
}
return quantity;
}

// преобразование к числу
count = parseInt(getCookie('COUNT'), 10);

setInterval(function() {
for (var i = count; i >= 1; i--) arrQuantity.push(getCookie('ITEM_NAME_' + i));
var qua = unique(arrQuantity).length;
qua > 0 ? $('#count-of-cookie').text('Количество наименований: ' + qua) :
$('#count-of-cookie').text('Количество наименований: 0');
}, 300);

var table, deleteAll, getName;

table = document.querySelector('#table-item');

deleteAll = function (e) {
var obj = [], groupObj = [];
if (e.target.className !== 'delete-all') return;
getName = e.target.parentElement.querySelector('.val-names').innerHTML;
for (var i = 1; i <= count; i++) obj.push(getCookie('ITEM_NAME_' + i));

// проверка по типу
for (var k = 0; k < obj.length; k++) console.log(typeof(obj[k]));
console.log(typeof(getName));

if (obj.length <= 0 || obj == undefined) {
console.log("Массив пустой");
} else {
for (var j = 0; j < obj.length; j++) {
if (obj[j] !== getName) continue;
groupObj.push(obj[j]);
}
console.log(groupObj);
}

}

//e.target.parentElement.innerHTML = '';
window.addEventListener('click', deleteAll);
}

Мне кажется что-то не так с if (obj[j] !== getName) continue; на 44 строкe

Mess4me
13.11.2015, 12:34
Ruslan_Berebnev,
возвращают один и тот же тип?

alert(typeof getCookie('COUNT'));
alert(typeof parseInt(getCookie('COUNT')));

Ruslan_Berebnev
13.11.2015, 12:55
Получилось! Оказывается в getName надо было все пробелы заменить на "+".
Вот рабочий вариант, если кому интересно. Всем спасибо за внимание!

if (!navigator.cookieEnabled) {
alert('Включите cookie для комфортной работы с этим сайтом');
} else {
var arrQuantity = [], quantity = [], count;

function unique(arr) {
nextVal: for (var i = 0; i < arr.length; i++) {
var str = arr[i];
for (var j = 0; j < quantity.length; j++) {
if (quantity[j] == str) continue nextVal;
}
quantity.push(str);
}
return quantity;
}

function groupArray(arr, val) {
var object = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== val) continue;
object.push(arr[i]);
}
return object;
}

setInterval(function() {
for (var i = getCookie('COUNT'); i >= 1; i--) arrQuantity.push(getCookie('ITEM_NAME_' + i));
var qua = unique(arrQuantity).length;
qua > 0 ? $('#count-of-cookie').text('Количество наименований: ' + qua) :
$('#count-of-cookie').text('Количество наименований: 0');
}, 300);

var table, deleteAll;

table = document.querySelector('#table-item');
count = parseInt(getCookie('COUNT'), 10);

deleteAll = function (e) {
var obj = [], groupObj;
if (e.target.className !== 'delete-all') return;
var getName = e.target.parentElement.querySelector('.val-names').innerHTML;
for (var i = 1; i <= count; i++) obj.push(getCookie('ITEM_NAME_' + i));

if (obj.length <= 0 || obj == undefined) {
console.log("Массив пустой");
} else {
getName = getName.replace(/\ /g, "+");
groupObj = groupArray(obj, getName);
console.log(groupObj);
}

}

//e.target.parentElement.innerHTML = '';
window.addEventListener('click', deleteAll);
}