@afront_area_51

Как соеденить 2 массива?

Здраствуйте!
Что то я туплю...
есть первый массив :
const first = [
    { name: 'first', value: '' },
    { name: 'second', value: 10 },
]

есть 2й массив:
const second = [
    { name: 'first', value: 0 },
    { name: 'third', value: 20 }
]

нужно получить 3й:
const third = [
    { name: 'first', value: 0 },
    { name: 'second', value: 10 },
    { name: 'third', value: 20 }
]


Условие создания 3го массива:
Если имя совпадает, но значения нет. Берем то значение, которое ближе.
Массивы могут отличаться по длинне.
  • Вопрос задан
  • 267 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Метод, как предлагали уже многие:
  1. склеить оба массива в один,
  2. пройтись последовательно по всем, собирая «словарь», где уникальный ключ name, а значение – весь объект с name и value. Перезаписывать предыдущий с таким же name или нет – по условию;
  3. вернуть массив значений этого «словаря» - уцелевшие уникальные объекты.


const uniq = (a, b) => Object.values(
  a.concat(b).reduce(
    (acc, o) => {
      if (!acc[o.name]) acc[o.name] = o;
      else if (Number.isFinite(o.value)) acc[o.name].value = o.value;
      return acc;
    }, {}
  )
);

Для проверки, число это или нет, можно использовать метод Number.isFinite()

Тесты
//###########################
const first = [{ name: 'first', value: '' }, { name: 'second', value: 10 }];
const second = [{ name: 'first', value: 0 }, { name: 'third', value: 20 }];
/*
[
  {
    "name": "first",
    "value": 0
  },
  {
    "name": "second",
    "value": 10
  },
  {
    "name": "third",
    "value": 20
  }
]
*/

//###########################
const first = [{ name: 'first', value: 100 }, { name: 'second', value: 0 }];
const second = [{ name: 'first', value: -111 }, { name: 'second', value: '' }];

/*
[
  {
    "name": "first",
    "value": -111
  },
  {
    "name": "second",
    "value": 0
  }
]
*/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
@StockholmSyndrome
[...first, ...second].filter(({value}) => typeof value === 'number');
Ответ написан
yudinikita
@yudinikita
Инженер-программист из России
const array1 = [1, 2, 3];
const array2 = [2, 3, 4];
console.log([...new Set([...array1, ...array2])]);
// prints [1, 2, 3, 4]
Ответ написан
alexbuki
@alexbuki
программист js
Как вариант соберите оба, потом ненужные элементы удалите.

const third = second.concat(first);
third.forEach((item,i)=>{
if (!item.value || item.value == '' ) {
third.splice(i,1);
}
});

Либо, можно пробежаться по обоим массивам, добавляя в третии только нужные элементы
Какое условие создания третьего массива не совсем понятно
Ответ написан
Комментировать
@Karpion
Надо два цикла.

В первом цикле просто копируем первый массив в третий (впрочем, это можно сделать и без цикла).

Во втором цикле пробегаем по всем элементам второго массива. Запрашиваем в третьем массиве элемент с таким именем. Если его нет (undefined) - то копируем элемент второго массива в третий. Если же элемент с таким именем в третьем массиве есть - то присваиваем элементу третьего массива "то значение, которое ближе" (эту фразу я не понял).
Ответ написан
Комментировать
teknik2008
@teknik2008
Расскажите про GOLANG. Мне интересно
Можно с помощью lodash

_.unionBy([2.1], [1.2, 2.3], Math.floor);
// => [2.1, 1.2]
 
// The `_.property` iteratee shorthand.
_.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }, { 'x': 2 }]
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы