JS reducer: вернуть объединенный массив объектов - PullRequest
0 голосов
/ 28 января 2019

У меня есть два таких массива объектов:

const first = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: false}, {text: 'sometext3', applicable: true}];

const second = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}];

В результате я хочу получить такой массив:

const result = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}, {text: 'sometext3', applicable: true}];

so => ​​просто добавить во второй массив все не-существующие элементы из первого массива, отфильтрованные по текстовому ключу.

это можно сделать через редукторы?или, может быть, лучше?

Ответы [ 5 ]

0 голосов
/ 28 января 2019

Вы могли бы сделать

const first = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: false}, {text: 'sometext3', applicable: true}];

const second = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}];

const results = [...second, ...first.filter(({text:firstText})=>!second.find(({text})=>text===firstText))]

console.log(results);

, но не клонирует объекты.

0 голосов
/ 28 января 2019

Просто выполните итерацию по первому массиву и проверьте, присутствует ли каждый элемент во втором массиве или нет, если нет, то нажмите на второй массив.

first.forEach((item) => {
    const index = second.findIndex((st) => st.text === item.text);
    if(index < 0) {
        second.push(item);
    }
})
0 голосов
/ 28 января 2019

Вы можете использовать фильтр для удаления дубликатов, используя ключ.

function concatAndRemoveDuplicates(arr1, arr2) {
  return arr1.concat(
    arr2.filter((o) => !arr2.map((x) => x.text).includes(o.text)),
  );
}
0 голосов
/ 28 января 2019

Что касается ваших тегов, я вижу, что у вас есть возможность использовать ES6, чтобы вы могли сделать это с помощью Установите , например, чтобы иметь уникальные значения в вашем массиве, а затем отфильтровать его:

const grouped = [...second, ...first];
const result = 
   [ ...new Set(grouped.map(({ text}) => text))]
   .map(text => grouped.find(obj => obj.text === text))

Тесты

Вот ссылка с тестами : enter image description here

0 голосов
/ 28 января 2019

Вы можете использовать карты

const first = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: false}, {text: 'sometext3', applicable: true}];

const second = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}];

var a=second.map((e)=>e.text);
first.map((e)=>{a.includes(e.text)?false:second.push(e)})
console.log(second);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...