如何解决如何按键合并两个对象中的数组Javascript
我正在尝试编写一个通过键合并两个对象的函数。这两个对象都有一个数字数组作为它们的值对,它是我想要合并的数组。
这个函数的输入是
const obj1 = {
foo: [1,2],bar: [3],baz: [4],};
const obj2 = {
foo: [5],baz: [6,7],};
输出应该是
{
foo: [1,2,5],baz: [4,6,7]
}
我尝试使用 concat 和 spread 运算符,但是我得到的答案是缺少第二个对象的 foo 中的“5”。另外,我注意到我目前的方法,如果一个键/值对只存在于 obj2 中,它不会被复制。有没有更好的方法来解决这个问题?这是我的代码,请帮忙!
function mergeByKey(obj1,obj2) {
let resultObj = {};
for (let key1 in obj1) {
for (let key2 in obj2) {
if (key1 === key2) {
resultObj[key1] = [...obj1[key1],...obj2[key1]];
} else {
resultObj[key1] = obj1[key1];
}
}
}
return resultObj;
}
**Output from code**
{ foo: [ 1,2 ],bar: [ 3 ],baz: [ 4,7 ] }
解决方法
不是最优雅的解决方案,但它似乎有效
function mergeObjects(obj1,obj2){
var response = {}
for (let key in obj1) {
response[key] = mergeProperty(obj1,obj2,key);
}
for (let key in obj2) {
response[key] = mergeProperty(obj1,key);
}
return response;
}
function mergeProperty(obj1,property){
let response = [];
if(obj1.hasOwnProperty(property)){
response = [...response,...obj1[property]]
}
if(obj2.hasOwnProperty(property)){
response = [...response,...obj2[property]]
}
return response;
}
const o1 = {
foo: [1,2],bar: [3],baz: [4],};
const o2 = {
foo: [5],baz: [6,7],};
console.log(mergeObjects(o1,o2))
您可以从两个对象中获取不同的键数组,然后迭代该数组并检查一个对象而不是另一个对象中的键 - 因此获取该数组,或者如果键在两个对象中,则合并数组。
见下文:
const obj1 = {
foo: [1,};
const obj2 = {
foo: [5],};
//The output should be
//{
// foo: [1,2,5],// bar: [3],// baz: [4,6,7]
//}
// keys from both objects,unique
const allKeys = [... new Set(Object.keys(obj1).concat(Object.keys(obj2)))];
// iterate all keys
const result = allKeys.reduce((a,c) => {
if (obj1[c] && !obj2[c]) a[c] = obj1[c];
if (!obj1[c] && obj2[c]) a[c] = obj2[c];
if (obj1[c] && obj2[c]) a[c] = obj1[c].concat(obj2[c]);
return a;
},{});
console.log(result);
您可以使用扩展语法 ...
将两个对象合并为一个,当您在合并的对象上使用 Object.keys()
时,这将为您提供来自两个对象的键。然后您可以在这个键数组上使用 .reduce()
来创建一个新对象。对于每个键,您可以从 obj1 获取数组(如果它不存在,则使用 || []
将其默认为空数组),与来自 obj2 的数组连接(如果不存在,您也可以默认此数组)存在于空数组中):
const obj1 = { foo: [1,};
const obj2 = { foo: [5],};
const merged = {...obj1,...obj2};
const res = Object.keys(merged).reduce((acc,key) => ({
...acc,[key]: (obj1[key] || []).concat(obj2[key] || [])
}),{});
console.log(res);
尝试这样的操作(假设您不知道对象键并且值始终是数组)。
function merge(x,y) {
const keys = new Set([...Object.keys(x),...Object.keys(y)]);
const merged = {};
for ( const k of keys ) {
merged[k] = [ ...(x[k] || []),...(y[k] || []) ];
}
return merged;
}
,
你可以这样做...
const
obj1 = { foo: [ 1,2 ],bar: [ 3 ],baz: [ 4 ] },obj2 = { foo: [ 5 ],baz: [ 6,7] },obj3 = { foo: [ 6 ],bar: [11],baz: [ 33,14] },obj4 = { foo: [ 88 ],truc:[ 123 ]},obj5 = { baz: [ 116,17] }
;
function mergeByKey(...objN )
{
let o_names = objN.reduce((list,objArg,indx) => // objArg is obj1,objN
{
Object.keys(objArg).forEach( k => // make a list of object name [ objIndexs...]
{ // ob [ objIndexs...] on function argument
if (!list[k]) list[k] = []
list[k].push(indx)
})
return list
},{})
let res = {}
for (let o_name in o_names )
res[o_name] = o_names[o_name].reduce((a,c)=>[...a,...objN[c][o_name]],[] )
return res
}
console.log( mergeByKey( obj1,obj3,obj4,obj5 ))
// or just - console.log( mergeByKey( obj1,obj2 ))
.as-console-wrapper {max-height: 100%!important;top:0}
var obj1 = { foo: [1,baz: [4] },obj2 = { foo: [5],merged = Object.create( obj1 );
for( var x in obj2 )
merged[ x ] = obj1[ x ].concat( obj2[ x ] )
;
console.log( merged )
;
我已经在函数之外解决了您的挑战,但它确实有效,而且如果您愿意,也很容易在函数中实现它,结果如您所愿:
// first create an array with all the keys from both objects
let keys = Object.keys(obj1).concat(Object.keys(obj2));
// Then remove/filter the duplicates keys
let uniqueKeys = keys.filter((c,index) => {
return keys.indexOf(c) === index;
});
//at last do the merge. us if statment to avoid concatenating undefiend elements
const obj3={};
for(let key of uniqueKeys){
if ( Object.keys(obj1).includes(key) && Object.keys(obj2).includes(key)){
obj3[key]= obj1[key].concat( obj2[key]);
} else if (Object.keys(obj1).includes(key))
{
obj3[key]= obj1[key];
}
else{
obj3[key]= obj2[key];
}
}
console.log(obj3);
```
[1]: https://i.stack.imgur.com/w0RbI.png
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。