通过匹配第二个JavaScript对象数组中的项来更新JavaScript对象数组

时间:2018-02-15 12:40:48

标签: javascript arrays

很抱歉要问,但我的脑袋是碎片。我有两个非常相似的对象数组(我简化了我的问题/示例,而不是使用我正在使用的实际数据来减少代码)我希望我的第一个数组循环遍历第二个项目,确定是否有ID当前对象与第二个数组中项目的ID匹配,如果匹配,则第一个数组中数组项的price属性将更新为第二个数组中匹配对象的价格值。因此,例如,id值为1的firstArray对象的价格会更新为25,因为这是第二个对象中具有匹配ID的对象中的价格... phew!

.filter

我不想使用循环,我宁愿使用.filter或.map的函数式编程......我只是想不出怎么做。任何建议将不胜感激。

如果我应该.map或{{1}},我会感到困惑吗?通过第一个数组循环似乎很容易,它正在检查第二个使我头痒的数组。

我现在正在尝试这个,但这里的人通常比我自己更快更聪明,并建议更有说服力的解决方案。

7 个答案:

答案 0 :(得分:3)

您可以使用map方法创建新数组,使用find搜索其他数组中具有相同ID的对象。



const firstArray = [{"id":"1","name":"Shirt","price":"15.00"},{"id":"2","name":"Pants","price":"30.00"},{"id":"3","name":"Socks","price":"8.00"},{"id":"4","name":"Gloves","price":"5.00"},{"id":"5","name":"Shirt","price":"16.00"}]
const secondArray = [{"id":"1","name":"Shirt","price":"25.00"},{"id":"2","name":"Pants","price":"40.00"},{"id":"3","name":"Socks","price":"12.00"},{"id":"4","name":"Gloves","price":"6.00"},{"id":"5","name":"Shirt","price":"21.00"},{"id":"6","name":"Hat","price":"30.00"}]

const result = firstArray.map(o => {
  const obj = secondArray.find(e => e.id == o.id);
  return Object.assign({}, o, obj && {price: obj.price})
})

console.log(result)




您还可以使用Map创建id-price作为键值,稍后再使用它来匹配ID。



const firstArray = [{"id":"1","name":"Shirt","price":"15.00"},{"id":"2","name":"Pants","price":"30.00"},{"id":"3","name":"Socks","price":"8.00"},{"id":"4","name":"Gloves","price":"5.00"},{"id":"5","name":"Shirt","price":"16.00"}]
const secondArray = [{"id":"1","name":"Shirt","price":"25.00"},{"id":"2","name":"Pants","price":"40.00"},{"id":"3","name":"Socks","price":"12.00"},{"id":"4","name":"Gloves","price":"6.00"},{"id":"5","name":"Shirt","price":"21.00"},{"id":"6","name":"Hat","price":"30.00"}]

const m = new Map(secondArray.map(({id, price}) => [id, price]))
const result = firstArray.map(e => Object.assign({}, e, m.has(e.id) && {price: m.get(e.id)}))

console.log(result)




答案 1 :(得分:1)

您可以使用Map并收集所有新价格,然后更新frist数组。

var firstArray = [{ id: "1", name: "Shirt", price: "15.00" }, { id: "2", name: "Pants", price: "30.00" }, { id: "3", name: "Socks", price: "8.00" }, { id: "4", name: "Gloves", price: "5.00" }, { id: "5", name: "Shirt", price: "16.00" }],
 secondArray = [{ id: "1", name: "Shirt", price: "25.00" }, { id: "2", name: "Pants", price: "40.00" }, { id: "3", name: "Socks", price: "12.00" }, { id: "4", name: "Gloves", price: "6.00" }, { id: "5", name: "Shirt", price: "21.00" }, { id: "6", name: "Hat", price: "30.00" }];

firstArray.forEach(
    (m => o => m.has(o.id) && (o.price = m.get(o.id)))
        (secondArray.reduce((m, { id, price }) => m.set(id, price), new Map))
);

console.log(firstArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

您可以尝试这样的事情:

  • 创建一个保存给定ID价格的对象
  • 遍历您的数组并检查地图中是否存在该ID。
    • 如果是,请设置此值
    • 如果没有,请返回当前值。

var firstArray = [{ id: "1", name: "Shirt", price: "15.00" }, { id: "2", name: "Pants", price: "30.00" }, { id: "3", name: "Socks", price: "8.00" }, { id: "4", name: "Gloves", price: "5.00" }, { id: "5", name: "Shirt", price: "16.00" }],
 secondArray = [{ id: "1", name: "Shirt", price: "25.00" }, { id: "2", name: "Pants", price: "40.00" }, { id: "3", name: "Socks", price: "12.00" }, { id: "4", name: "Gloves", price: "6.00" }, { id: "5", name: "Shirt", price: "21.00" }, { id: "6", name: "Hat", price: "30.00" }];

var idPriceMap = secondArray.reduce(function(acc, item){
  acc[item.id] = item.price;
  return acc;
}, {});

var result = firstArray.map(function(item){
  return Object.assign({}, item, { price: (idPriceMap[item.id] || irem.price)});
})

console.log(result)

答案 3 :(得分:0)

类似的东西:

firstArray.forEach(function(e){
  var m = secondArray.find(function(f){ return f.id === e.id; });
  e.price = m ? m.price || e.price;
});

答案 4 :(得分:0)

使用forEachfindIndex函数。

const firstArray = [     {id:"1", name: "Shirt", price: "15.00"},     {id:"2", name: "Pants", price: "30.00"},     {id:"3", name: "Socks", price: "8.00"},     {id:"4", name: "Gloves", price: "5.00"},     {id:"5", name: "Shirt", price: "16.00" } ];

const secondArray = [     {id:"1", name: "Shirt", price: "25.00"},     {id:"2", name: "Pants", price: "40.00"},     {id:"3", name: "Socks", price: "12.00"},     {id:"4", name: "Gloves", price: "6.00"},     {id:"5", name: "Shirt", price: "21.00"},     {id:"6", name: "Hat", price: "30.00" } ];

firstArray.forEach((i) => {
  var index = secondArray.findIndex((ii) => i.id === ii.id);
  if (index > -1) secondArray[index].price = i.price;
});

console.log(secondArray)
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 5 :(得分:0)

如果您需要更新每个项目的价格,那么我建议您先构建一个索引,然后再使用它。这样您就不需要在secondArray上多次迭代。

function getValues(){
  const values = [value1, value2, value3, value4, value5];
  for(var i=0; i<values.length; i++) {
    if(!validateForm(values[i]) {
      // Break the loop and return false
      return false;
    }
  }
}

// For all other cases return true
return true;

答案 6 :(得分:0)

我会做这样的事情。你说你不想要循环,但我认为这是最干净的版本,你可以重复使用它

var firstArray = [
    {id:"1", name: "Shirt", price: "15.00"},
    {id:"2", name: "Pants", price: "30.00"},
    {id:"3", name: "Socks", price: "8.00"},
    {id:"4", name: "Gloves", price: "5.00"},
    {id:"5", name: "Shirt", price: "16.00" }
];

var secondArray = [
    {id:"1", name: "Shirt", price: "25.00"},
    {id:"2", name: "Pants", price: "40.00"},
    {id:"3", name: "Socks", price: "12.00"},
    {id:"4", name: "Gloves", price: "6.00"},
    {id:"5", name: "Shirt", price: "21.00"},
    {id:"6", name: "Hat", price: "30.00" }
]


fnUpdater(firstArray,secondArray,"id","price")


function fnUpdater(oldArray,newArray,matchProperty,replaceProperty){
    for(let x=0; x<oldArray.length; x++){
        for(let y=0; y<oldArray.length; y++){
            if(oldArray[x].id==newArray[y].id){
                oldArray[x][replaceProperty]=newArray[y][replaceProperty];
            }
        }
    }
}