#javascript #arrays #filter
#javascript #массивы #Фильтр
Вопрос:
Мне нужно найти индекс массива объекта array, где он равен true. Мой массив:
[
[
{id: 1, status: false},
{id: 2, status: true}
],
[
{id: 13, status: false},
{id: 14, status: false}
],
[
{id: 18, status: true},
{id: 19, status: false}
]
]
В приведенном выше случае я должен ожидать, что будут возвращены индексы 0 и 2.
Комментарии:
1. В вашем вопросе / примере есть некоторая реальная двусмысленность. Ответ на этот вопрос таков
[0, 2]
: «Каковы индексы массивов во внешнем массиве, в которых есть некоторый элемент сstatus
oftrue
?» Но это также ответ на совсем другой вопрос: » Для каких индексов существуют внутренние массивы, где значение в этом индексе имеетstatus
значениеtrue
?» Что вы имеете в виду?
Ответ №1:
Используется reduce
для получения индексов элементов, some
элементы которых удовлетворяют условию:
input.reduce((acc, arr, i) => (
arr.some(obj => obj.status) amp;amp; acc.push(i)
, acc), [])
const input = [[{"id":1,"status":false},{"id":2,"status":true}],[{"id":13,"status":false},{"id":14,"status":false}],[{"id":18,"status":true},{"id":19,"status":false}]];
const result = input.reduce((acc, arr, i) => (
arr.some(obj => obj.status) amp;amp; acc.push(i)
, acc), []);
console.log(result);
Ответ №2:
В решении проблемы есть два шага.
- Сначала пройдите по массиву
- Во-вторых, проверьте условие. Вы можете проверить условие, используя два метода массива.
- some: проверяет, прошел ли какой-либо из элементов массива тест, и возвращает true или false на основе теста.
- фильтр: создает массив на основе условия, и именно по этой причине я проверил длину массива в следующем коде.
const data = [
[
{ id: 1, status: false },
{ id: 2, status: true },
],
[
{ id: 13, status: false },
{ id: 14, status: false },
],
[
{ id: 18, status: true },
{ id: 19, status: false },
],
];
let ret = [];
data.forEach((x, i) => {
if (x.some((y) => y.status)) ret.push(i);
});
console.log(ret);
ret = [];
data.forEach((x, i) => {
if (x.filter((y) => y.status).length > 0) ret.push(i);
});
console.log(ret);
Я использовал методы some и filter для проверки условия, а для обхода массива я использовал метод array forEach.
Комментарии:
1. это неправильное использование
filter
.some
был создан, чтобы позаботиться о таких случаях — в нем четко указано назначение кода, использованиеfilter
здесь просто добавляет ненужную когнитивную нагрузку и нагрузку на производительность.
Ответ №3:
В основном то же решение, что и у marzelin, но, на мой взгляд, более читаемое. Оператор запятой в возвращаемом значении обратного вызова может быть довольно запутанным.
const data = [
[
{id: 1, status: false},
{id: 2, status: true}
],
[
{id: 13, status: false},
{id: 14, status: false}
],
[
{id: 18, status: true},
{id: 19, status: false}
]
]
//pV=previous value, cV=current value, cI=current index
const result = data.reduce(function (pV, cV, cI) {
if (cV.some(function (obj) {
return obj.status
})) {
pV.push(cI);
}
return pV;
},[]);
console.log(result);