Задать вопрос

Как имея массив уникальных значений создать массив из значений объекта?

Всем привет, допустим есть некий массив уникальных значений. const arr = ['1', '9', '11', '12', '13'] и есть массив у которого в объектах есть два ключа, например const obj = [{uniq: 1, sum: 2}, {uniq: 11, sum: 6}]. подскажите как добиться результата const res = [2, null, 6, null, null]. То есть длина результирующего массива равна длине arr. Но если в массиве obj у объекта нет соответствующего uniq то в res закидываем null, если есть то в res закидываем sum.
Предполагаю что надо использовать reduce.
типа
arr.reduce((sum, i) => {
const obj = [{uniq: 1, sum: 2}, {uniq: 11, sum: 6}]
// нужно условие проверки на совпадение i c объектом из obj, если есть то sum.push(obj.sum), если нет то sum.push(null)
}, [])

как правильно выставить условие?
Спасибо за отклик
  • Вопрос задан
  • 175 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Кого будем подставлять вместо отсутствующих значений: const defaultValue = null;.

Предполагаю что надо использовать reduce.

Как скажете:

const result = arr1.reduce((acc, n) => (
  acc.push(arr2.find(m => m.uniq === +n)?.sum ?? defaultValue),
  acc
), []);

Или вот написание циклов руками - ничем не хуже:

const result = [];

for (const n of arr1) {
  let item = defaultValue;

  for (const m of arr2) {
    if (m.uniq == n) {
      item = m.sum;
      break;
    }
  }

  result[result.length] = item;
}

Ещё рекурсия отлично подойдёт:

const sums = Object.fromEntries(arr2.map(n => [ n.uniq, n.sum ]));
const result = (function get(i, n = arr1[i]) {
  return i < arr1.length
    ? [ Object.hasOwn(sums, n) ? sums[n] : defaultValue, ...get(-~i) ]
    : [];
})(0);

Главное, чтобы не map. Это ведь совсем не круто - идти наиболее простым и очевидным путём:

const result = arr1.map(function(n) {
  return this.has(n) ? this.get(n) : defaultValue;
}, new Map(arr2.map(n => [ `${n.uniq}`, n.sum ])));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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