У меня есть набор данных, который представляет собой вложенные массивы, эти массивы могут быть пустыми или они могут фактически содержать идентификатор, если один из идентификаторов массивов соответствует идентификатору, с которым я сравниваю его, я хочу взять все данные внутри этого массива, который соответствует и присвоить его переменной, которая будет использоваться...
пример:
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
для фильтрации внутреннего массива и метод 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
не замечал раньше. Хороший!
Удивительно! Я люблю stackoverflow по этой причине, быстрый и точный совет, я позабочусь о том, чтобы полностью понять методы, прежде чем на самом деле их использовать. Спасибо.
Соответствующий массив возвращает пустой - я не получаю массив, содержащий какие-либо данные
Это была моя вина, что я сравнивал несуществующий идентификатор, вот почему. Мои извенения.
Вы можете сделать это с помощью комбинации .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);
использовать
Array#filter