Object.assign(),合并/覆盖键,用于复制数组的值以创建对象

时间:2018-09-26 10:49:31

标签: javascript arrays object ecmascript-6 spread-syntax

我曾经有一个带有一个对象的数组,就像这样:  var myObj = [{'key': {an object}}];

我将其转换为如下对象:   Object.assign({}, ...myobj)

获取此信息:{'key': [{an object}]}

问题在于,现在我在myobj上有两个具有相同KEY的项目,如下所示:

[{'key': {an object}}, {'key': {another object}}]

如果我执行相同的Object.assign,我得到的结果是一个对象,其中包含两个其他对象,并且正常:{'key': {an object}}, {'key': {another object}}

问题是我可以将我的myobj转换为该结构:

{'key': [{an object}, {another object}]}

5 个答案:

答案 0 :(得分:0)

您可以使用Array.map()

const data = [{'key': 'an object'}, {'key': 'another object'}];

const result = {
  key: data.map(o => o.key)
};

console.log(result);

答案 1 :(得分:0)

您可以通过循环对象的条目并用数组替换值来手动合并对象。这是一个可以与两个参数一起使用或在reduce中使用的合并函数的示例:

const mergeObjects = (obj1, obj2) => 
  [...Object.entries(obj1), ...Object.entries(obj2)].reduce(
    (merged, [k, v]) => Object.assign(
      merged,
      { [k]: (merged[k] || []).concat(v) }
    ),
    {}
  );

console.log(mergeObjects({ key: "a"}, { key: "b" }));
console.log(
  [
    { key: "a", test: "b" }, { key: "c" }, { key: "d" } 
  ].reduce(mergeObjects)
);

答案 2 :(得分:0)

您可以通过在第一级使用相同的键来合并对象。

function merge(...objects) {
    return objects.reduce((a, b) => {
        Object.entries(b).forEach(([k, v]) => {
            if (!(k in a)) {
                return a[k] = v;
            }
            if (!Array.isArray(a[k])) {
                a[k] = [a[k]];
            }
            a[k].push(v);
        });
        return a;
    }, {});
}
    
console.log(merge({ key: { foo: 'bar' } }, { key: { foo: 'baz' } }));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)

const finalObj = {};
const myObj =  [{'key': { obj : "hello"}}, {'key': { obj : "hello"}}, {'key2': {obj : "world"}}, {'key3': {obj : "world"}}];

for( const oj of myObj) {
  const key = Object.keys(oj)[0];

  if(finalObj[key]){
     const tempArray =[].concat(finalObj[key]);
     tempArray.push(oj[key]);
     finalObj[key] = tempArray         
  }else{
   finalObj[key] = oj[key];
  }

}

console.log(finalObj);

Final Output : {"key":[{"obj":"hello"},{"obj":"hello"}],"key2":{"obj":"world"},"key3":{"obj":"world"}}

答案 4 :(得分:0)

您可以使用reduce实现此目的

        const obj = [{key: {val: 1}}, {key: {val: 2}}]
        const reqObj = obj.reduce((acc, cur) => [...acc, cur.key],[])
        console.log('reqObj: ', reqObj)