合并具有相同键的两个对象会覆盖第一个数组

时间:2021-03-06 21:16:37

标签: javascript arrays object merge

我想将一个数组与另一个数组合并。唯一的问题是每个数组都在一个对象中。

直觉上我尝试了 {...arrObj, ...newArrObj} 但这会导致 newArrObj 覆盖 arrObj 中的项目。

const array = ['an', 'array'];
const newArray = [, , 'new', 'ehrray'];

const obj = {
  key: { ...array
  }
};

const newObj = {
  key: { ...newArray
  }
};

const merged = { ...obj,
  ...newObj
};

console.log(merged);

我希望 merged 是:

{
  "key": {
    "0": "an",
    "1": "array",
    "2": "new",
    "3": "ehrray"
  }
}

但是收到

{
  "key": {
    "2": "new",
    "3": "ehrray"
  }
}

3 个答案:

答案 0 :(得分:0)

这可能有用

const a0 = ['1', '2', undefined , undefined, '5', '6', '7'];
const a1 = [undefined, undefined, '3', '4'];

function merge(a, b) {
  return a.map(function(v,i){ return v?v:b[i]});
}

console.log(a0 > a1?merge(a0, a1):merge(a1, a0));

答案 1 :(得分:0)

我想更新一下,我最终使用 recursive merge 来合并包含数组的嵌套对象。

const array = ['an', 'array'];
const newArray = [, , 'new', 'ehrray'];

const obj = {
  key: { ...array
  }
};

const newObj = {
  key: { ...newArray
  }
};

const merge = (obj1, obj2) => {

  const recursiveMerge = (obj, entries) => {
    for (const [key, value] of entries) {
      if (typeof value === "object") {
        obj[key] = obj[key] ? { ...obj[key]
        } : {};
        recursiveMerge(obj[key], Object.entries(value))
      } else {
        obj[key] = value;
      }
    }

    return obj;
  }

  return recursiveMerge(obj1, Object.entries(obj2))
}

console.log(merge(obj, newObj));

答案 2 :(得分:-1)

<块引用>

这个想法是只有少数设置有未设置的值。例如。 const newArray = new Array(4); newArray[2] = 'new';

{ value: null },甚至 { value: undefined } 与完全没有 { foo: 42 }value 也不是一回事。这就是在您的示例中 "an""array"null 中的 newArray 覆盖的原因。

您可以通过交换将数组添加到结果的顺序来解决这个特定示例,但是只要两个数组都包含 null-values,就无法使用 spread-syntax / { {1}} 单独。你必须实现行为:

Object.assign

相关问题