Из массива вытащить одинаковые элементы и записать в другой массив.
Создаётся массив по событию. По этому же событию происходит выборка из ранее созданного массива, чтобы записать результат в другой массив, но на выходе всегда получается пустой массив. Почему?
//функция вытащит нужное значение массива и перезапишет его 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); |
Цитата:
|
Да. Это сётчик. Он правильный.
|
.filter() тоже дал пустой массив. Не понимаю в чём дело. getName - строка, obj[i] - строка, строку со строкой сравниваю.
|
Ruslan_Berebnev,
нужен полноценный макет |
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> |
Mess4me,
а кнопочку посмотреть? [HTML run][/HTML] |
А как? :-?
|
Понял)
|
Mess4me,
:victory: |
Если в конце написать 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; } |
Вот полный скрипт
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); } |
Ruslan_Berebnev,
а функцию getCookie() можно посмотреть :) ? Вы вставили setCookie |
Ruslan_Berebnev,
в коде нет установки 'COUNT' |
Значение COUNT берётся из куков.
|
function getCookie(name) { var matches = document.cookie.match(new RegExp( "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" )); return matches ? decodeURIComponent(matches[1]) : undefined; } |
Ruslan_Berebnev,
и при выполнении функции оно равно числу? Вы проверяли? |
Да, это число. Я специально для этих целей использовал parseInt()
|
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); |
Минут 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 |
Ruslan_Berebnev,
возвращают один и тот же тип? alert(typeof getCookie('COUNT')); alert(typeof parseInt(getCookie('COUNT'))); |
Получилось! Оказывается в 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); } |
Часовой пояс GMT +3, время: 22:32. |