1

我有两个对象obj1obj2如果 obj1 属性info有键idcode

如果键的数组对象info与匹配,则将obj2 的 替换为 obj1。如果不匹配,则将其更改为obj1code and idobj2nos0

如果 id 和 code 与 javscript 中的另一个数组对象匹配,如何替换嵌套数组对象的数组对象中的值。

function newArray (obj1,obj2){
 return obj2.map(e=>{
   nos = obj1.filter(i=>i.info.some(x=>x.id === e.id && x.code === i.code)
   return nos ? {...e, nos} : e;
 })
}

var obj1 =[
 {tot: 4, info: [{id:1, code:"x1",nos:2},{id:2, code:"x2",nos:2}] }
 {tot: 2, info: [{id:3, code:"x3",nos:2},{id:5, code:"x5",nos:3}}]}
]

var obj2 = [
 {id:1, code: "x1", nos:1, name:"sample1"},
 {id:2, code: "x2", nos:2, name:"sample2"},
 {id:3, code:"x3",nos:3, name:"sample3"},
 {id:4, code: "x1", nos:0},
 {id:5, code: "x5", nos:3, name:"sample5"},
]

预期输出:

[
{id:1, code: "x1", nos:2, name:"sample1"},
{id:2, code: "x2", nos:2, name:"sample2"},
{id:3, code:"x3",nos:2, name:"sample3"},
{id:4, code: "x1", nos:0},
{id:5, code:"x5",nos:3, name"sample5"}
]
4

1 回答 1

0

首先将所有内容提取obj1到一个 Array 中,这样剩下的事情就更容易了:

function newArray (obj1, obj2) {
  // Extract every item from obj1 into an Array, to make the next step easier
  const arr1 = obj1.reduce((res, group) => [ ...res, ...group.info], []);
 
  return obj2.map(e => {
    const match = arr1.find(x => x.id === e.id && x.code === e.code);
    return { ...e, nos: match ? match.nos : 0 };
  });
}

var obj1 =[
 { tot: 4, info: [{ id:1, code:"x1", nos:2 },{ id:2, code:"x2",nos:2 }] },
 { tot: 2, info: [{ id:3, code:"x3", nos:2 },{ id:5, code:"x5",nos:3 }] }
];

var obj2 = [
 { id:1, code: "x1", nos:1, name: "sample1" },
 { id:2, code: "x2", nos:2, name: "sample2" },
 { id:3, code:"x3", nos:3, name: "sample3" },
 { id:4, code: "x1", nos: 0 },
 { id:5, code: "x5", nos: 3, name: "sample5" }
];

const res = newArray(obj1, obj2);

console.log( JSON.stringify(res).replace(/\},\{/g, '},\n{') );
/*
[{"id":1,"code":"x1","nos":2,"name":"sample1"},
{"id":2,"code":"x2","nos":2,"name":"sample2"},
{"id":3,"code":"x3","nos":2,"name":"sample3"},
{"id":4,"code":"x1","nos":0},
{"id":5,"code":"x5","nos":3,"name":"sample5"}]
*/

于 2020-06-29T00:24:22.030 回答