А значит эта особенность никак не влияет на код и не может быть причиной никаких ошибокБольшинство методов массива, такие как map или filter игнорируют пустые значения. Так что разница все таки есть и приводить к ошибкам оно может
const arr1 = new Array(10);
console.log(0 in arr1); // false
const arr2 = Array.from({length: 10});
console.log(0 in arr2); // true
неожиданно правда? connection.query('SELECT * FROM menu', (err, result) => {
if(err) { // обрабатываем ошибку запроса
console.error(err);
return;
}
// строим объект из строк с id в качестве ключей, это нужно для быстрого доступа по id
const index = result.reduce((acc, row) => ({...acc, [row.id]: row}), {});
const menu = []; // сюда будем складывать результат верхнего уровня
for(const row of result) {
if(row.parent_id === 0) { // если родителя нет
menu.push(row); // то это пункт верхнего уровня, кидаем в результат
continue; // и переходим к следующей записи
}
const parent = index[row.parent_id]; // из построенного ранее объекта находим родителя
if(!parent) { // если не нашли, то нужно сказать, что база некорректная
console.warn(`Undefined parent with id ${row.parent_id}`);
continue;
}
if(!parent.children) { // если у текущего родителя еще не добавляли потомков
parent.children = []; // то создаем из них массив
}
parent.children.push(row); // ну и добавляем к родителю текущую строку как потомка
}
console.log(menu);
});
Так как js работает с ссылками, то изменив объект в index мы его так же меняем и в result и в menufunction makeMenuLevel(menuItems) {
// на каждый уровень вложенности меню мы создаем список ul
return `<ul>${menuItems.map( // а li генерим для каждого элемента с помощью метода массива map
item =>`<li>${item.title}${item.children // если у текущего элемента есть потомки
? makeMenuLevel(item.children) // то функция рекурсивно вызывает саму себя, генеря список ul-li для потомков
: ''}</li>`;
).join('')}</ul>`;
}
io.on('menu', (data) => {
console.log(makeMenuLevel(data))
})
function makeMenuLevel(menuItems) {
return `<ul>${menuItems.map(
item =>`<li>${item.title}${item.children ? makeMenuLevel(item.children) : ''}</li>`;
).join('')}</ul>`;
}
ЗЫ: вы даже не представляете сколько за сегодняшнюю ночь людей матюкнется в мой адрес за то что кинутая мной в ответе демка запускает музон))))К счастью не запускает в нормальных браузерах из-за политик браузеров, возникших по описанным Вами причинам.
setTimeout(func.apply(this, arguments), timeOut);
тут func выполнится сразу, не дожидаясь таймаутаsetTimeout(func, timeOut, ...arguments);
setTimeout(func.bind(this, ...arguments), timeOut);
var self = this;
var agrs = arguments; // вообще так делать с arguments не стоит, но для учебного примера я упростил
setTimeout(function() {
func.apply(self, args);
}, timeOut);
#define null 0