gpt4 book ai didi

javascript - 合并两个 javascript 对象添加公共(public)属性的值

转载 作者:数据小太阳 更新时间:2023-10-29 03:54:33 32 4
gpt4 key购买 nike

我有两个或多个 javascript 对象。我想合并它们,添加公共(public)属性的值,然后按值的降序对它们进行排序。

例如

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}

var c = merge(a,b)

c 应该是这样的:

c = {
fr: 24,
en: 13,
in:9,
br:8
}

即合并两个对象,添加公共(public)键的值,然后对键进行排序。

这是我尝试过的:

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}
c = {}

// copy common values and all values of a to c
for(var k in a){
if(typeof b[k] != 'undefined'){
c[k] = a[k] + b[k]
}
else{ c[k] = a[k]}
}

// copy remaining values of b (which were not common)
for(var k in b){
if(typeof c[k]== 'undefined'){
c[k] = b[k]
}
}

// Create a object array for sorting
var arr = [];

for(var k in c){
arr.push({lang:k,count:c[k]})
}

// Sort object array
arr.sort(function(a, b) {
return b.count - a.count;
})

但我觉得不好。这么多循环 :( 如果有人能提供不那么困惑的好代码,那就太好了。

最佳答案

在 ES2015+ 中,对象属性有序的(首先按升序数字键,然后按非数字键的插入顺序)。如果您使用其中一种指定了迭代顺序的方法(如 Object.getOwnPropertyNames),规范会保证这一点。

在 ES2020+ 中,以前未指定枚举顺序的方法 are now specified (尽管环境已经跟随它很久了)。

但您必须确保所有属性都不是数字(否则,无论插入顺序如何,它们都会排在第一位,然后是非数字属性)。

使用reduce 遍历每个对象并在累加器上创建或添加相同的属性。然后,对对象的条目进行排序,并使用Object.fromEntries 将其转换为具有排序属性的对象。不需要 jQuery:

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}
console.log(merge(a, b));

function merge(...objects) {
const merged = objects.reduce((a, obj) => {
Object.entries(obj).forEach(([key, val]) => {
a[key] = (a[key] || 0) + val;
});
return a;
}, {});
return Object.fromEntries(
Object.entries(merged).sort(
(a, b) => b[1] - a[1]
)
);
}

关于javascript - 合并两个 javascript 对象添加公共(public)属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9174965/

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