#javascript #arrays #ecmascript-6 #lodash
#javascript #массивы #ecmascript-6 #Lodash
Вопрос:
У меня есть список первых массивов
const a = [{id:1, value:'apple'}, {id:2, value: 'ball'},{id:3, value: 'cat'}]
У меня есть другой массив идентификаторов
const ids = [1,2]
Теперь мне нужно получить список значений массива из a
, идентификатор которого указан в массиве ids. Ожидаемый результат:
const b = [{id:1, value:'apple'}, {id:2, value: 'ball'}]
Ответ №1:
Вы можете использовать Array.prototype.filter
:
a.filter(({ id }) => ids.includes(id));
const a = [{id:1, value:'apple'}, {id:2, value: 'ball'}];
const ids = [1,2];
const result = a.filter(({ id }) => ids.includes(id));
console.log(result);
Ответ №2:
Вы можете создать a Set
из массива идентификаторов и использовать Array#filter
with Set#has
(который выполняется во O(1)
времени) для повышения производительности.
const a = [{id:1, value:'apple'}, {id:2, value: 'ball'},{id:3, value: 'cat'}]
const ids = [1,2]
const idSet = new Set(ids);
const res = a.filter(({id})=>idSet.has(id));
console.log(res);
Ответ №3:
Если я вас правильно понял, вы хотите получить value
параметры из a
для каждой из записей, которые имеют соответствие id
в ids
коллекции?
let results = a.filter(node=>ids.indexOf(node.id) !== -1);
Чтобы разбить Array.prototype.filter
команду:
a.filter
функционально сообщает компилятору повторять a
коллекцию (как for
цикл); хотя единственные записи, которые возвращаются из него, возвращаются, когда из его обратного вызова возвращается истинное значение (функция применяется после node=>
бита).
node
является ли временная переменная, назначенная активному индексу, проверяемому на итерации.
ids.indexOf(...)
запрашивает числовой индекс node.id
в коллекции. Если node.id
не присутствует нигде в коллекции, indexOf
возвращает -1
.
Итак, все вместе взятое: «выполните цикл a
и для каждого из содержащихся в нем объектов проверьте каждый из них на соответствие ids
и верните либо true
, либо false
в зависимости от того, было ли оно найдено (некоторое значение, ОТЛИЧНОЕ от -1
) или нет ( -1
). Массив. фильтр автоматически отобразит только те, чьи результаты были верными.