Как заменить объект A на B в массивах, если объект A имеет такое же свойство в объекте B

Я пытаюсь получить массив из двух разных массивов. Я не уверен, как это сделать с ES6.

Я хочу, чтобы current_year_data заменили на previous_year_data

Первый массив:

let previous_year_data = [
  { month: "January", value: 300 },
  { month: "February", value: 1 },
  { month: "March", value: 2 },
  { month: "April", value: 3 },
  { month: "May", value: 4 },
  { month: "Jun", value: 5 },
  { month: "July", value: 6 },
  { month: "August", value: 7 },
  { month: "September", value: 8 },
  { month: "October", value: 9 },
  { month: "November", value: 10 },
  { month: "December", value: 11 },
];

Второй массив:

let current_year_data = [
  { month: "January", value: 4459 }
];

Результат должен быть в:

let current_year_data = [
  { month: "January", value: 4459 },
  { month: "February", value: 1 },
  { month: "March", value: 2 },
  { month: "April", value: 3 },
  { month: "May", value: 4 },
  { month: "Jun", value: 5 },
  { month: "July", value: 6 },
  { month: "August", value: 7 },
  { month: "September", value: 8 },
  { month: "October", value: 9 },
  { month: "November", value: 10 },
  { month: "December", value: 11 },
];

Спасибо


person Snow Bases    schedule 20.01.2020    source источник


Ответы (2)


Можно использовать метод map. Кроме того, вы можете использовать Map коллекцию, чтобы иметь O(1) доступа к элементам элементов, когда вы map используете свой массив:

let unique = new Map(current_year_data.map(s=> [s.month, s.value]))
previous_year_data.map(({month, value})=> ({month, value: unique.get(month) || value }));

Пример:

let previous_year_data = [
  { month: "January", value: 300 },
  { month: "February", value: 1 },
  { month: "March", value: 2 },
  { month: "April", value: 3 },
  { month: "May", value: 4 },
  { month: "Jun", value: 5 },
  { month: "July", value: 6 },
  { month: "August", value: 7 },
  { month: "September", value: 8 },
  { month: "October", value: 9 },
  { month: "November", value: 10 },
  { month: "December", value: 11 },
];

let current_year_data = [
  { month: "January", value: 4459 }
];

let unique = new Map(current_year_data.map(s=> [s.month, s.value]))
const result = previous_year_data.map(({month, value})=> 
    ({month, value: unique.get(month) || value }));
console.log(result)

person StepUp    schedule 20.01.2020

Для таких требований подойдет объединение или объединение массивов JSON, уникальных по ключу! См. следующее:

// Примечание: будет выбран последний повторяющийся элемент в списке.

const previous_year_data = [
  { month: "January", value: 300 },
  { month: "February", value: 1 },
  { month: "March", value: 2 },
  { month: "April", value: 3 },
  { month: "May", value: 4 },
  { month: "Jun", value: 5 },
  { month: "July", value: 6 },
  { month: "August", value: 7 },
  { month: "September", value: 8 },
  { month: "October", value: 9 },
  { month: "November", value: 10 },
  { month: "December", value: 11 },
];

const current_year_data = [
  { month: "January", value: 4459 }
];

const key = 'month'; //Replace this key with unique key

const result = [...new Map([...previous_year_data, ...current_year_data].map(item =>
  [item[key], item])).values()];
  
console.log(result);

/*OUTPUT

[
  {
    "month": "January",
    "value": 4459
  },
  {
    "month": "February",
    "value": 1
  },
  {
    "month": "March",
    "value": 2
  },
  {
    "month": "April",
    "value": 3
  },
  {
    "month": "May",
    "value": 4
  },
  {
    "month": "Jun",
    "value": 5
  },
  {
    "month": "July",
    "value": 6
  },
  {
    "month": "August",
    "value": 7
  },
  {
    "month": "September",
    "value": 8
  },
  {
    "month": "October",
    "value": 9
  },
  {
    "month": "November",
    "value": 10
  },
  {
    "month": "December",
    "value": 11
  }
]

*/
  
  

person Arun Saini    schedule 20.01.2020