【问题标题】:modify the existing array object based on condition in javascript根据javascript中的条件修改现有数组对象
【发布时间】:2020-06-26 03:17:21
【问题描述】:

如何在javascript中修改数组对象,

obj1obj2两个数组对象,其中title的键值相同, 然后在javascript中添加到键details

如果obj1和obj2的标题相同,则在详细信息键中添加amt,idx

function modifyArray(obj1, obj2){
   return obj1.map(a1=> {
          return {
            ...a1,
            details: obj2
              .filter(a2=> a2.title=== a1.title)
              .map(a2=> ({ idx: a2.idx, amt: a2.amt|| 0 }))
          }
        })
}

var obj1= [ 
  {id:1, title: "item1", details: [{idx:1, amt: 100},{idx:2, amt: 200}]} 
  {id:2, title: "item2", details: []},
  {id:3, title: "item3" } 
]

var obj2 =[
  { idx:"3", title: "item1", amt: 120},
  { idx:"4", title: "item1", amt: 140},
  { idx:"1", title: "item2", amt: 220},
  { idx:"1", title: "item3", amt: 240},
  { idx:"2", title: "item3", amt: 200}
]

预期输出:

 [ 
  {id:1, title: "item1", details: [{idx:1, amt: 100},{idx:2, amt: 200},{idx:3, amt: 120},{idx:4, amt: 140}]} 
  {id:2, title: "item2", details: [{idx:1, amt: 220}]},
  {id:3, title: "item3", details: [{idx:1, amt: 240},{idx:2, amt: 200}] } 
]

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    不确定。但试试这样的。

    function comp(obj1, obj2) {
      const final = [];
      obj1.forEach((element1) => obj2.forEach((element2) => {
        if (element1.title == element2.title) {
          final.push({
            id: element1.id,
            title: element1.title,
            details: element1.details || []
          })
        }
      }))
      return final;
    }
    

    【讨论】:

      【解决方案2】:

      一种方法是通过合并两个数组来使用reduce。这里是:

      var obj1= [{id:1, title: "item1", details: [{idx:1, amt: 100},{idx:2, amt: 200}]}, {id:2, title: "item2", details: []}, {id:3, title: "item3" }];
      
      var obj2 =[ { idx:"3", title: "item1", amt: 120}, { idx:"4", title: "item1", amt: 140}, { idx:"1", title: "item2", amt: 220}, { idx:"1", title: "item3", amt: 240}, { idx:"2", title: "item3", amt: 200}];
      
      var result = Object.values([...obj1,...obj2].reduce((acc, elem)=>{
          if(!elem.idx){
           acc[elem.title] = elem.details ? elem : {...elem, details:[]}
           } else {
           acc[elem.title].details.push({idx:elem.idx, amt:elem.amt});
          }
          return acc; 
      },{}));
      
      console.log(result);

      【讨论】:

      • 谢谢,如果 obj2 还有一个对象 {idx:1, title: "item1", amt:100}, 相同的索引不应该在结果 obj 中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 2020-01-12
      • 2019-06-13
      • 2022-06-13
      • 2022-11-25
      • 1970-01-01
      相关资源
      最近更新 更多