虽然这个问题已经被问了一段时间,但我也想加入讨论。对于像这样需要重复执行基本功能的函数,如果可以的话,我更喜欢避免编写较长的函数和循环,并将函数开发为使用浅层Array.prototype函数的单行代码,例如.map()
,以及其他一些ES6+好用的工具,如Object.entries()
和Object.fromEntries()
。将所有这些组合在一起,我们可以相对轻松地执行此类函数。
首先,我将作为rest参数传递给函数的任意数量的对象与一个我们将用来收集所有键和值的空对象结合起来。
[{}, ...objs]
接下来,我将使用
.map()
数组原型函数与
Object.entries()
结合使用,循环遍历每个对象的所有条目以及它们包含的任何子数组元素,然后,如果尚未声明空对象的键,则将其设置为该值,否则,如果已经声明了对象键,则将新值推送到该键。
[{},...objs].map((e,i,a) => i ? Object.entries(e).map(f => (a[0][f[0]] ? a[0][f[0]].push(...([f[1]].flat())) : (a[0][f[0]] = [f[1]].flat()))) : e)[0]
最后,为了将任何单元素数组替换为其包含的值,我在结果数组上再次运行 .map()
函数,同时使用 Object.entries()
和 Object.fromEntries()
,类似于之前的操作。
let getMergedObjs = (...objs) => Object.fromEntries(Object.entries([{},...objs].map((e,i,a) => i ? Object.entries(e).map(f => (a[0][f[0]] ? a[0][f[0]].push(...([f[1]].flat())) : (a[0][f[0]] = [f[1]].flat()))) : e)[0]).map(e => e.map((f,i) => i ? (f.length > 1 ? f : f[0]) : f)));
这将为您留下最终合并的对象,与您所规定的完全一致。
let a = {
a: [1,9],
b: 1,
c: 1
}
let b = {
a: 2,
b: 2
}
let c = {
b: 3,
c: 3,
d: 5
}
let getMergedObjs = (...objs) => Object.fromEntries(Object.entries([{},...objs].map((e,i,a) => i ? Object.entries(e).map(f => (a[0][f[0]] ? a[0][f[0]].push(...([f[1]].flat())) : (a[0][f[0]] = [f[1]].flat()))) : e)[0]).map(e => e.map((f,i) => i ? (f.length > 1 ? f : f[0]) : f)));
getMergedObjs(a,b,c);
array
是否会变成{name:"foo1",value:["val1"]}
? - BenGvar newArray = $.extend({}, array, output);
- user3186219$.extend()
就可以胜任? - user3186219