сравнить два массива объекта и pu sh, если не существует - PullRequest
1 голос
/ 03 апреля 2020

у меня есть два массива объектов ниже

var array_1 = [{"Date": "2020-04-01", "Item" : 001},{"Date": "2020-04-03", "Item" : 002}]
var base_array = [{"Date": "2020-04-01", "Item" : null}, {"Date": "2020-04-02", "Item" : null}, 
                  {"Date": "2020-04-04", "Item" : null}]

я планирую изменить массив_1 как ниже

 var array_1 = [{"Date": "2020-04-01", "Item" : 001},
                {"Date": "2020-04-02", "Item" : null},
                {"Date": "2020-04-03", "Item" : 002},
                {"Date": "2020-04-04", "Item" : null}]

с даты "2020-04-02" и "2020-04-04" не существует в array_1, эти даты должны быть pu sh с "item" null, а "2020-04-01" не должно быть pu sh, поскольку они уже существуют в array_1.

я пробовал делать после каждого l oop, но не смог продолжить

небольшая заметка: base_array всегда будет содержать больше значения, чем array_1. так что почему я использовал base_array в качестве моего начального l oop

$.each(base_array , function (key,bvalue) {

    $.each(array_1, function (key,value) {
          if(bvalue.Date != value.Date){

               array_1.push({"Date" : value.Date, "Item": value.Item})
          }
    })
})

Ответы [ 5 ]

2 голосов
/ 03 апреля 2020

Вы можете взять таблицу ha sh, назначить объект на ту же дату и получить массив объектов.

В конце отсортировать массив по Date.

var array_1 = [{ Date: "2020-04-01", Item: "001" }, { Date: "2020-04-03", Item: "002" }],
    base_array = [{ Date: "2020-04-01", Item: null }, { Date: "2020-04-02", Item: null }, { Date: "2020-04-04", Item: null }],
    result = Object
        .values([...base_array, ...array_1].reduce((r, o) => (r[o.Date] = o, r), {}))
        .sort(({ Date: a }, { Date: b }) => a > b || -(a < b))

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2 голосов
/ 03 апреля 2020

Вы можете использовать Array.reduce() для base_array, передавая array_1 в качестве начального значения и добавляя только значения из base_array, где Date еще не существует в значении переноса:

var array_1 = [{
  "Date": "2020-04-01",
  "Item": 001
}, {
  "Date": "2020-04-03",
  "Item": 002
}];
var base_array = [{
    "Date": "2020-04-01",
    "Item": null
  }, {
    "Date": "2020-04-02",
    "Item": null
  },
  {
    "Date": "2020-04-04",
    "Item": null
  }
];

array_1 = base_array.reduce((c, v) => c.concat(c.some(e => e.Date == v.Date) ? [] : [v]), array_1);
console.log(array_1);
1 голос
/ 03 апреля 2020

Я не уверен, что заказ имел значение для вас, но если нет, то вот одно из решений

// Keep track of all dates already present in `array_1`.
let array_1_dates = new Set(array_1.map(array_1_elem => array_1_elem.Date));

// Push elements from `base_array` that are not in `array_1`.
for (let base_array_elem of base_array) {
  if (!array_1_dates.has(base_array_elem.Date)) {
    array_1.push(base_array_elem);
  }
}
1 голос
/ 03 апреля 2020

Вы можете использовать простой l oop и найти позицию вставки, используя сравнение.

var array_1 = [{
  "Date": "2020-04-01",
  "Item": 001
}, {
  "Date": "2020-04-03",
  "Item": 002
}]
var base_array = [{
    "Date": "2020-04-01",
    "Item": null
  }, {
    "Date": "2020-04-02",
    "Item": null
  },
  {
    "Date": "2020-04-04",
    "Item": null
  }
]

// iterate over second array
base_array.forEach(el => {
  for (let i = 0; i < array_1.length; i++) {
    // if value found return
    if (array_1[i].Date === el.Date) return;
    // if position found, insert and return
    if (array_1[i].Date > el.Date) {
      array_1.splice(i, 0, el);
      return
    }
  }
  // or insert at the end of the array
  array_1.push(el);
})

console.log(array_1);

ПРИМЕЧАНИЕ: Предполагается, что первый массив всегда в отсортированном порядке.


ОБНОВЛЕНИЕ: Или, если порядок может измениться, и вы не хотите добавлять их в конце, вы можете использовать Array#some и Array#filter метод.

var array_1 = [{
  "Date": "2020-04-01",
  "Item": 001
}, {
  "Date": "2020-04-03",
  "Item": 002
}]
var base_array = [{
    "Date": "2020-04-01",
    "Item": null
  }, {
    "Date": "2020-04-02",
    "Item": null
  },
  {
    "Date": "2020-04-04",
    "Item": null
  }
]

array_1.push(...base_array.filter(o => array_1.every(o1 => o1.Date !== o.Date)))

console.log(array_1);
1 голос
/ 03 апреля 2020

Сначала удалите из base_array иены, которые уже находятся на array_1, используя filter. Тогда concat.

var array_1 = [{"Date": "2020-04-01", "Item" : 001},{"Date": "2020-04-03", "Item" : 002}]
var base_array = [{"Date": "2020-04-01", "Item" : null}, {"Date": "2020-04-02", "Item" : null}, {"Date": "2020-04-04", "Item" : null}]
                  
var filtered = base_array.filter(({Date}) => !array_1.some(el => el.Date == Date));
var result = array_1.concat(filtered);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...