Конкат два массива с фильтрацией - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть два массива.Мне нужно объединить их обоих и создать новый массив, который имеет dayOfWeek 2, 3, 4, 5, 6. Что означает приоритет для dayOfWeek в array1.Значит нужно сохранить dayOfWeek 3, 4, 5 от array1.

array1 = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
]

array2 = [
  {dayOfWeek: 3, home1: "05:30"},
  {dayOfWeek: 4, home1: "06:30"},
  {dayOfWeek: 5, home1: "07:30"},
  {dayOfWeek: 6, home1: "08:30"},
]

Выход должен быть

finalArray = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
  {dayOfWeek: 6, home1: "08:30"},
]

Я пробовал это, но он выталкивает dayOfWeek из обоихмассивы.Как я могу их отфильтровать?

const finalArray = []
array1.map((a) => {
    array2.map((a2) => {
        if (a.dayOfWeek === a2.dayOfWeek) {
          finalArray.push(a)
        }
        if (a.dayOfWeek === a2.dayOfWeek) {
          finalArray.push(a2)
        }
    })
})

Заранее спасибо !!!

Ответы [ 6 ]

0 голосов
/ 23 ноября 2018

Используйте Лодаша _.unionBy().Преобладающий массив должен быть первым массивом, переданным функции.

const array1 = [{"dayOfWeek":2,"home1":"01:30"},{"dayOfWeek":3,"home1":"02:30"},{"dayOfWeek":4,"home1":"03:30"},{"dayOfWeek":5,"home1":"04:30"}]
const array2 = [{"dayOfWeek":3,"home1":"05:30"},{"dayOfWeek":4,"home1":"06:30"},{"dayOfWeek":5,"home1":"07:30"},{"dayOfWeek":6,"home1":"08:30"}]

const result = _.unionBy(array1, array2, 'dayOfWeek')

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

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

_.unionBy(array1, array2, o => `${o.id}-${o.dayOfWeek}`)
0 голосов
/ 23 ноября 2018

Вы также можете просто отфильтровать второй массив по отсутствующим элементам из первого, а затем объединить их с первым массивом без lodash:

const a1 = [ {dayOfWeek: 2, home1: "01:30"}, {dayOfWeek: 3, home1: "02:30"}, {dayOfWeek: 4, home1: "03:30"}, {dayOfWeek: 5, home1: "04:30"}, ]
const a2 = [ {dayOfWeek: 3, home1: "05:30"}, {dayOfWeek: 4, home1: "06:30"}, {dayOfWeek: 5, home1: "07:30"}, {dayOfWeek: 6, home1: "08:30"}, ]

const r = a1.concat(a2.filter(x => !a1.some(y => y.dayOfWeek == x.dayOfWeek)))

console.log(r)

Это делается через Array.concat, Array.filter и Array.some

0 голосов
/ 23 ноября 2018

Вы также можете использовать Set и Array.filter

let array1 = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
]

let array2 = [
  {dayOfWeek: 3, home1: "05:30"},
  {dayOfWeek: 4, home1: "06:30"},
  {dayOfWeek: 5, home1: "07:30"},
  {dayOfWeek: 6, home1: "08:30"},
]

let s = new Set()
console.log([...array1, ...array2].filter(d => {
    let avail = s.has(d.dayOfWeek)
    !avail && s.add(d.dayOfWeek)
    return !avail
  }
) )
0 голосов
/ 23 ноября 2018

Вы можете использовать комбинацию Array#slice(), Array#forEach() и Array#some() методы:

  • Использование.slice(0), чтобы получить все элементы array1 в finalArray.
  • Затем используйте .forEach(), чтобы перебрать array2 и получить все элементы, которые не существуют в finalArray.
  • Используйте .some(), чтобы проверить, существует ли повторяющийся элемент (dayOfWeek).

Вот как должен выглядеть ваш код:

var finalArray = array1.slice(0);
array2.forEach(function(a){
      if(!finalArray.some(e => e.dayOfWeek == a.dayOfWeek))
          finalArray.push(a);
});

Демонстрация:

let array1 = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
];

let array2 = [
  {dayOfWeek: 3, home1: "05:30"},
  {dayOfWeek: 4, home1: "06:30"},
  {dayOfWeek: 5, home1: "07:30"},
  {dayOfWeek: 6, home1: "08:30"},
];

var finalArray = array1.slice(0);
array2.forEach(function(a){
      if(!finalArray.some(e => e.dayOfWeek == a.dayOfWeek))
          finalArray.push(a);
});

console.log(finalArray);
0 голосов
/ 23 ноября 2018

Profer.Вы можете использовать объект карты, чтобы получить уникальные элементы

const array1 = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
];

const array2 = [
  {dayOfWeek: 3, home1: "05:30"},
  {dayOfWeek: 4, home1: "06:30"},
  {dayOfWeek: 5, home1: "07:30"},
  {dayOfWeek: 6, home1: "08:30"},
];

function getFinalArray(array, uniqueProperty) {
  return array
    .filter(value => value)
    .reduce(
      (arrayMap, item) => {
        return arrayMap.set(item[uniqueProperty], item)
      }, new Map()
    );
}

const result = Array.from(
  getFinalArray([...array2, ...array1], 'dayOfWeek').values()
);
0 голосов
/ 23 ноября 2018

вы можете использовать метод конкатенации массивов и после этого сделать фильтр.

var c = array1.concat(array2);
...