Перебирать вложенный массив для сопоставления идентификаторов

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

пример:

data = [[],[],[],[],[],[],[],[],[{"id":"123","name":"DARES HOUSE 2019","startDate":null,"endDate":null,"country":null,"city":null,"type":"Event","members":null}],[],[],[],[],[],[],[],[],[],[],[]]

id = 123

matchedArray =
  for (var i = 0; i < potentialEvents.length; i++) {
    for (var j = 0; j < potentialEvents[i].length; j++) {

      if (id === potentialEvents[i].id) {
        return;
      }
    }
  }
console.info(matchedArray)

Я пытаюсь сделать так, чтобы matchedArray был массивом с совпадающими идентификаторами!

если можете помочь, большое спасибо!

использовать Array#filter

Pranav C Balan 08.04.2019 11:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
189
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать метод Array#filter для фильтрации внутреннего массива и метод Array#flatMap для объединения отфильтрованного массива в один.

let data = [[],[],[],[],[],[],[],[],[{"id":"123","name":"DARES HOUSE 2019","startDate":null,"endDate":null,"country":null,"city":null,"type":"Event","members":null}],[],[],[],[],[],[],[],[],[],[],[]];
let id = 123;

let matchedArray = data.flatMap(arr => arr.filter(obj => obj.id == id))
console.info(matchedArray)

ооо flatMap не замечал раньше. Хороший!

Jamiec 08.04.2019 11:57

Удивительно! Я люблю stackoverflow по этой причине, быстрый и точный совет, я позабочусь о том, чтобы полностью понять методы, прежде чем на самом деле их использовать. Спасибо.

Sparlarva 08.04.2019 12:03

Соответствующий массив возвращает пустой - я не получаю массив, содержащий какие-либо данные

Sparlarva 08.04.2019 12:15

Это была моя вина, что я сравнивал несуществующий идентификатор, вот почему. Мои извенения.

Sparlarva 08.04.2019 12:38

Вы можете сделать это с помощью комбинации .map, .filter и .flat

var data = [[],[],[],[],[],[],[],[],[{"id":"123","name":"DARES HOUSE 2019","startDate":null,"endDate":null,"country":null,"city":null,"type":"Event","members":null}],[],[],[],[],[],[],[],[],[],[],[]]

var id = 123;

var matchedArray = data.map( arr => {
   return arr.filter(x => x.id == id);
}).flat();

console.info(matchedArray);

Я бы рекомендовал использовать .some, а не .filter/.map/.flatMap. Основное преимущество заключается в том, что он позволяет остановить обход массива, когда элемент найден.

На больших массивах с большим количеством данных будет эффективнее (в ≈50 раз быстрее): тест jsperf

const data = [[],[],[],[],[],[],[],[],[{"id":"123","name":"DARES HOUSE 2019","startDate":null,"endDate":null,"country":null,"city":null,"type":"Event","members":null}],[],[],[],[],[],[],[],[],[],[],[]]

const id = 123;
let matchedArray = null;

data.some((a) => {
  return a.some((v) => {
    if (v != null && v.id == id) {
      matchedArray = a;
      return true;
    }
  });
});

console.info(matchedArray);

Другие вопросы по теме