Javascript 如何合并和获取两个对象和对象具有相同键的值之和
我有两个对象需要展平以实现图表Javascript 如何合并和获取两个对象和对象具有相同键的值之和,javascript,object,javascript-objects,Javascript,Object,Javascript Objects,我有两个对象需要展平以实现图表 2019-09-12: { type1: { subType1: { value: 5 }, subType2: {…} }, type2: { subType1: { value
2019-09-12: {
type1: {
subType1: {
value: 5
},
subType2: {…}
},
type2: {
subType1: {
value: 8
},
subType2: {…}
}
}
这需要变成这样,
cumulated: {
subType1: {
value: 13
},
subType2: {sum}
}
你可以用。比如说
var object = {
'a': [{ 'b': 2 }, { 'd': 4 }]
};
var other = {
'a': [{ 'c': 3 }, { 'e': 5 }]
};
_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
可以迭代对象的键并求和
const obj = {
type1: {
subType1: {
value: 5
},
subType2: {
value: 1
},
},
type2: {
subType1: {
value: 8
},
subType2: {
value: 2
}
}
};
const combine = (obj) => Object.keys(obj).reduce((res, cur) => {
for (let key of Object.keys(obj[cur])) {
if (res.hasOwnProperty(key)) {
res[key].value += obj[cur][key].value;
} else {
res[key] = obj[cur][key];
}
};
return res;
}, {});
console.log(combine(obj));
谢谢大家!
以下是我在最后得出的结论:
我用过lodash图书馆,但它真的很快很干净。物体的形状也不重要,它可以像你的物体一样深
import mergeWith from 'lodash/mergeWith'
mergeWith({}, ...Object.values(objectThatNeedsToCollapse), (objValue, srcValue) =>
typeof objValue === "number" ? objValue + srcValue : undefined
)
问题是我把所有的东西都当作对象,没有任何数组让我使用,也有两个层次的Merging是的,它也可以工作。你能试试lodash函数merge吗?看看原始的输入和输出,看起来请求是通过求和来组合相似的键。不是merge,而是merge with方法起作用。merge覆盖需要求和的值,但是我添加了这个函数来mergeWith()
(objValue,srcValue,key,object,source,stack)=>{console.log(JSON.stringify({objValue,srcValue})),如果(typeof objValue==“number”)返回objValue+srcValue}
并且它可以正常工作,谢谢!然而,我从es lint中得到这个警告,迭代器/生成器需要再生器运行时,这对于本指南来说太重了,不允许它们使用。另外,应该避免循环,以利于数组迭代。
这给了我一个方向,唯一可以优化它的东西是你可以尝试将(…)的更改为Object.keys(obj[cur])。forEach(…)
它工作得很好,非常不同于我所想的方法,谢谢
import mergeWith from 'lodash/mergeWith'
mergeWith({}, ...Object.values(objectThatNeedsToCollapse), (objValue, srcValue) =>
typeof objValue === "number" ? objValue + srcValue : undefined
)