Я сделал то, что, как мне кажется, создает массив идентификаторов категорий, и это мой код, чтобы попытаться использовать их идентификаторы для возврата ключей своих дочерних каналов.

    var filtered_category_ids = [""];
    var filtered_category_ids = filtered_category_ids.reduce((acc, id) => 
    acc.push(filtered_category_names.findKey((c) => c.name === name)));
    var filtered_channel_ids = [];
    const children = this.children;
    filtered_category_ids.forEach(element => filtered_channel_ids.push((children.keyArray())));
    console.log(filtered_channel_ids);

Однако при запуске я получаю ошибку TypeError "filter_category_ids.forEach is not a function"

0
flagarium 14 Окт 2020 в 02:13

1 ответ

Лучший ответ

Второй аргумент Array.prototype.reduce очень важен. Это значение, которое acc примет в начале. Если нет второго аргумента, он примет значение первого элемента в массиве.

console.log([1, 2, 3].reduce((acc, curr) => acc + curr)) // acc starts as `1`
console.log([1, 2, 3].reduce((acc, curr) => acc + curr, 10)) // but what if we wanted it to start at `10`

Этот параметр в основном требуется при работе с массивами, объектами и т. Д.

console.log([1, 2, 3].reduce((acc, curr) => acc.push(curr))) // right now, `acc` is `1` (not an array; does not have the .push() method)
console.log([1, 2, 3].reduce((acc, curr) => acc.push(curr), [])); // start with an empty array

Однако есть вторая проблема (как видно из приведенного выше фрагмента). Array.prototype.push() фактически возвращает длину массива, а не сам массив.

console.log(
  [1, 2, 3].reduce((acc, curr) => {
    acc.push(curr); // push element to array
    return acc; // but return the arr itself
  }, [])
);

// second (simplified) method
console.log([1, 2, 3].reduce((acc, curr) => [...acc, curr], []))

Вы также можете использовать Array.from(), что было бы проще в этой ситуации.

console.log(Array.from([1, 2, 3], (num) => num);

В вашем коде есть еще несколько нестандартных вещей, поэтому я предлагаю вам сделать следующее:

var filtered_category_names = ['']; // I think you might've meant `category_names` instead of `ids`

// you're trying to get IDs from names, so I'm not sure why you're reducing the ID array (before it's established)
// and using id as a parameter name when you use `name` in the actual function
var filtered_category_ids = Array.from(filtered_category_names, (name) => 
 client.channels.cache.findKey((c) => c.name === name)
);

var filtered_channel_ids = [];
filtered_category_ids.forEach((id) =>
 // filtered_channel_ids.push(children.keyArray()) // you're adding the same value to the array multiple times?

 // get the category's children and add their IDs to the array
 filtered.channel.ids.push(client.channels.cache.get(id).children.keyArray())
);
console.log(filtered_channel_ids);
0
Lioness100 14 Окт 2020 в 01:46