Задать вопрос
Chefranov
@Chefranov
Новичок

Как найти значения в другом массиве объектов?

Имеются два массива:
var array1 = [{"value": "0E1"}, {"value":"8B3"}...];
var array2 = [{"code":"0E1", "desc": "Some text"}, {"code":"8B3", "desc": "Some text"}, {"code":"9N8", "desc": "Some text"}...]

Как с помощью первого массива вывести подходящие объекты по коду из второго? По сути первый массив - это запрос, а в второй база в которой ищу по value.

Как я понял мне должен помочь метод .filter()
array2.filter(item => item.code == array1.value)
но я запутался
  • Вопрос задан
  • 208 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Всегда ли искомый объект существует (т.е., существует ли для каждого value из первого массива аналогичное значение code во втором)? Если это не важно и вас устраивает возможное получение undefined, тогда

const result = array1.map(n => array2.find(m => m.code === n.value));

В противном случае, можно ничего не выдавать, если объект не найден:

const obj2 = Object.fromEntries(array2.map(n => [ n.code, n ]));
const result = array1.reduce((acc, n) => (
  (n = obj2[n.value]) && acc.push(n),
  acc
), []);

Или, подставлять вместо отсутствующего объекта какое-нибудь другое значение:

const result = array1.map(function({ value: n }) {
  return this.get(n) ?? `объект с code="${n}" отсутствует`;
}, new Map(array2.map(n => [ n.code, n ])));

Могут ли значения code во втором массиве быть неуникальны? Если да, и надо получать все объекты с указанными code, а не один, то можно предварительно сгруппировать второй массив по значениям code:

const result = array1.flatMap(function(n) {
  return this[n.value] ?? [];
}, array2.reduce((acc, n) => ((acc[n.code] ??= []).push(n), acc), {}));

Имеет ли значение взаимное расположение объектов в результирующем массиве? Если оно должно быть таким же, как и в array2, то его и надо перебирать при извлечении объектов, а не первый массив:

const result = array2.filter(function(n) {
  return this.has(n.code);
}, new Set(array1.map(n => n.value)));
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const array1 = [{ value: '0E1' }, { value: '8B3' }];
const array2 = [
  { code: '0E1', desc: 'Some text' },
  { code: '8B3', desc: 'Some text' },
  { code: '9N8', desc: 'Some text' },
];
const filter = array1.map((el) => el.value);
const result = array2.filter((el) => filter.includes(el.code));
console.log(result);
// Array [ {…}, {…} ]
​//  0: Object { code: "0E1", desc: "Some text" }
​//  1: Object { code: "8B3", desc: "Some text" }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы