在JavaScript中合并两个对象并忽略未定义的值

9

我需要合并两个对象,但不希望为已定义的值分配未定义的值。

A = { activity: 'purchased', count: undefined, time: '09:05:33' }
B = { activity: 'purchased', count: '51', time: undefined }

当我尝试使用Object.assign时,undefined正在替换具有值的字段。

我的期望

C = { activity: 'purchased', count: '51', time: '09:05:33' }

1
首先删除未定义的 Object.keys(A).filter(key => A[key]).reduce((acc, key) => (acc[key] = A[key], acc), {}) 并进行赋值。 - Kharel
AB是否具有相同的属性名称(即任何一个对象中都没有额外的属性),并且AB是否可以具有相同属性的不同值?如果是,则应该分配哪个值。 - kapil pandey
我清理了标签,但保留了_reactjs_标签,因为我猜想你正在寻找一个不可变的解决方案? - Emile Bergeron
7个回答

4

扩展运算符(...)在合并对象时效果很好,而使用JSON.stringify()和JSON.parse()有一个简单的解决方案可以移除 undefined。请参见下面的示例:

const A = { activity: 'purchased', count: undefined, time: '09:05:33' };
const B = { activity: 'purchased', count: '51', time: undefined };

//If you don't care about date objects then only use below method 
const C = {...JSON.parse(JSON.stringify(A)), ...JSON.parse(JSON.stringify(B))};

console.log(C);


3
这个方法不能处理其他类型的值(任何不符合JSON序列化的值),所以请小心。 - Emile Bergeron

3

let A = { activity: 'purchased', count: undefined, time: '09:05:33' }
let B = { activity: 'purchased', count: '51', time: undefined }

let C={}
Object.keys({...A,...B}).map(key=>{
C[key]=B[key]||A[key]
})
console.log(C)


你最终会失去B的额外属性。 - MadPapo
我正在考虑 AB 具有相同的属性。 - kapil pandey
所以它并不完美...这不是一个完整的合并。但它仅基于A结构。 - MadPapo
我已经更新了解决方案,现在它是一个完整的合并。但问题仍然不明确。如果相同的属性具有不同的值,那么应该考虑哪个值? - kapil pandey
1
这将用A中的任何内容替换B中的所有其他falsy值。 - Emile Bergeron

3

0

您可以通过查看第二个对象的条目并仅获取值不为undefined的键/值对来合并对象。

const
    merge = (a, b) => Object.assign(
        {},
        a,
        ...Object.entries(b).map(([k, v]) => v === undefined ? {} : { [k]: v })
    ),
    a = { activity: 'purchased', count: undefined, time: '09:05:33' },
    b = { activity: 'purchased', count: '51', time: undefined };

console.log(merge(a, b));


0
我刚刚也不得不做同样的事情,并想出了以下解决方案:
function assignIgnoreUndefined(...args) {
  const final = args.shift();
  args.filter(arg => !!arg).forEach(arg => {
    Object.entries(arg).forEach(nv => {
      const [ name, value ] = nv;
      if (value !== undefined) {
        final[name] = value;
      }
    });
  });
  return final;
}

示例用法:

const A = { activity: 'purchased', count: undefined, time: '09:05:33' };
const B = { activity: 'purchased', count: '51', time: undefined };
const C = assignIgnoreUndefined({}, A, B);
console.log(C);

输出:

{ activity: 'purchased', time: '09:05:33', count: '51' }

-2

let A = { activity: 'purchased', count: undefined, time: '09:05:33' }
let B = { activity: 'purchased', count: '51', time: undefined }

for (let a in A) {
  if (A[a] === undefined) 
    delete A[a];
}

for (let b in B) {
  if (B[b] === undefined) 
    delete B[b];
}

let c = {...A, ...B} // this will merge identical key/values

console.log(c)


-2
const A = { activity: 'purchased', count: undefined, time: '09:05:33' }
const B = { activity: 'purchased', count: '51', time: undefined }
const AKeys = Object.keys(A);
const BKeys = Object.keys(B);
const C = {};
AKeys.forEach(element=>A[element] && C[element]=A[element])
BKeys.forEach(element=>B[element] && C[element]=B[element])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接