gpt4 book ai didi

javascript - 合并两个对象,但明确定义可以设置的键

转载 作者:行者123 更新时间:2023-12-03 04:38:24 26 4
gpt4 key购买 nike

我想将两个对象合并为一个新对象,其中一个对象覆盖属性(如果两个对象都有属性)。

这对于 ES6 spread 来说很容易做到,但在这种特殊情况下,我想使用一种仍然定义可以设置哪些键的方法。基本上创建一个我的最终对象允许的属性的“白名单”。 (通过扩展,任何属性都将合并到新对象中)。

有没有使用 ES6+ 的方法来做到这一点?

两个对象:

var o1 = { 
a: 'foo',
b: 'bar',
c: 'baz'
}

var o2 = {
a: 'pop',
bad_property: 'dont copy me'
}

var oMerged = {
a: 'pop', // I came from obj_2
b: 'bar',
c: 'baz'
}

合并方法:

// Method 1: Use spreads, problem is this hides the keys.
var oMerged = {
...o1,
...o2
};

// Method 2: Shows each key, but requires a ternary to check if obj_2 has the key.
var oMerged = {
a: (o2.a !== undefined) ? o2.a : o1.a,
b: (o2.b !== undefined) ? o2.b : o1.b,
c: (o2.c !== undefined) ? o2.c : o1.c
}

// Method 3: Define what keys can be merged, but use a more concise syntax / possibly an ES6+ feature.
???

编辑:明确表示该对象应该有一个可接受属性的白名单。有很好的答案,但它们需要 Not Acceptable 属性的黑名单。 “白名单”的原因是它向其他开发人员显示最终对象的形状。

最佳答案

现在,您可以使用 factory() 函数创建不同的合并函数,每个函数都有自己的一组允许的单词,然后调用这些函数来合并任意数量的对象。

const obj1 = { 
a: 'foo',
b: 'bar',
c: 'baz'
}

const obj2 = {
a: 'pop',
bad_property: 'dont copy me'
}

const obj3 = {
another_one: 'test',
another_bad_property: 'dont copy this either'
}

const factory = allowed => {
return (...args) => {
const temp = {}
args.forEach(obj => {
Object.keys(obj).forEach(key => {
if (allowed.indexOf(key) !== -1) {
temp[key] = obj[key]
}
})
})

return temp
}
}

const mergeWith4AllowedKeys = factory(['a', 'b', 'c', 'another_one'])
const merged = mergeWith4AllowedKeys(obj1, obj2, obj3)

console.log(merged)

const mergeWith3AllowedKeys = factory(['a', 'b', 'c'])
const secondBatch = mergeWith3AllowedKeys(obj1, obj2) // only 2

console.log(secondBatch)

关于javascript - 合并两个对象,但明确定义可以设置的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43194960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com