Найти индекс массива объекта array

#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 of true ?» Но это также ответ на совсем другой вопрос: » Для каких индексов существуют внутренние массивы, где значение в этом индексе имеет 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);