Объедините два объекта и увеличьте ключи в ECMAScript 6 - PullRequest
0 голосов
/ 01 июля 2018

Я хочу объединить несколько объектов, но поскольку их ключи равны, при использовании Object.assign() он просто возвращает те же свойства, что и последний.

let obj1 = {0: "a", 1: "b", 2: "c", 3: "d"};
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"};

Но вывод, который я хочу

let output = {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f", 6: "g", 7: "h"};

Ответы [ 4 ]

0 голосов
/ 01 июля 2018

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

let obj1 = { 0: "a", 1: "b", 2: "c", 3: "d" },
    obj2 = { 0: "e", 1: "f", 2: "g", 3: "h" },
    merged = Object.assign({}, [obj1, obj2].reduce((r, o) => r.concat(Object.values(o)), []));
    
console.log(merged);
0 голосов
/ 01 июля 2018

Создайте массив объектов и используйте метод Reduce. Передайте пустой объект как thisArg и сохраните index, который будет увеличиваться, и этот index будет действовать как ключ. Внутри метода Reduce используйте Object.values который даст массиву все значения текущего объекта, такие как [a,b,c,d]. Теперь итерируйте этот массив и обновите пустой объект, который был первоначально передан

let obj1 = {
  0: "a",
  1: "b",
  2: "c",
  3: "d"
};
let obj2 = {
  0: "e",
  1: "f",
  2: "g",
  3: "h"
};
let comObj = [obj1, obj2]
let index = 0;
let mrgObj = comObj.reduce(function(acc, curr) {
  let getVals = Object.values(curr);
  getVals.forEach(function(item, currIndex) {
    acc[index] = item
    index++;
  })
  return acc;
}, {});
console.log(mrgObj)
0 голосов
/ 01 июля 2018

Если ключи числовые, преобразуйте оба объекта в массивы, используя Object.assign([], obj) (или Object.values(obj), хотя это не ES6 ), concat их, затем поместите все перечисляемые свойства в новый объект с помощью Object.assign:

const obj1 = {
      0: "a",
      1: "b",
      2: "c",
      3: "d"
    },
  obj2 = {
      0: "e",
      1: "f",
      2: "g",
      3: "h"
    },
  output = Object.assign({}, Object.assign([], obj1).concat(Object.assign([], obj2)));

console.log(output);

Хотя, если предположение о числовом ключе справедливо, рассмотрите возможность пропустить окончательный Object.assign. Все свойства будут одинаковыми, плюс некоторые полезные методы и свойства массива (перечисляемые свойства будут точно совпадать).

0 голосов
/ 01 июля 2018

Вы должны просто использовать массивы для этого. Это сделает вашу жизнь проще.

Сказав это, вы можете взять values у объектов, которые будут массивами, объединить их, а затем создать новый объект с:

let obj1 = {0: "a", 1: "b", 2: "c", 3: "d"}
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"}

let obj = Object.values(obj1).concat(Object.values(obj2))
          .reduce((a, c, i) => (a[i] = c, a), {})
console.log(obj)

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

let obj1 = {0: "a", 1: "b", 2: "c", 3: "d"}
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"}

let obj = {...Object.values(obj1).concat(Object.values(obj2))}
console.log(obj)

Неопределенно, что должно случиться с таким случаем:

let obj1 = {0: "a", 1: "b", 2: "c", 4: "d"}
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...