很抱歉要问,但我的脑袋是碎片。我有两个非常相似的对象数组(我简化了我的问题/示例,而不是使用我正在使用的实际数据来减少代码)我希望我的第一个数组循环遍历第二个项目,确定是否有ID当前对象与第二个数组中项目的ID匹配,如果匹配,则第一个数组中数组项的price属性将更新为第二个数组中匹配对象的价格值。因此,例如,id值为1的firstArray对象的价格会更新为25,因为这是第二个对象中具有匹配ID的对象中的价格... phew!
.filter
我不想使用循环,我宁愿使用.filter或.map的函数式编程......我只是想不出怎么做。任何建议将不胜感激。
如果我应该.map
或{{1}},我会感到困惑吗?通过第一个数组循环似乎很容易,它正在检查第二个使我头痒的数组。
我现在正在尝试这个,但这里的人通常比我自己更快更聪明,并建议更有说服力的解决方案。
答案 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)
您可以尝试这样的事情:
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)
使用forEach
和findIndex
函数。
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];
}
}
}
}