Javascript 筛选和克隆对象属性
我有两个对象数组:itemsList和itemsFetched。每个数组中的所有对象都具有相同的结构(nr个键/值)。其中一个键具有相同的“含义”,但名称不同(itemsList上的item\u id,itemsFetched上的id)。他们的价值观是一样的 我需要过滤项目列表数组,只保留项目id值等于项目蚀刻上的id值的对象。然后将itemsFetched数组(与item_id=id匹配)上的每个对象的键/值count复制(添加)到过滤数组中 我有一个有效的代码,但我确信这不是解决这个问题的最佳方法。我之前已经问过类似的问题(关于“过滤器”部分),解决了我的问题,但是由于我必须在过滤之后添加“计数”部分,所以我最终重构了整个过程 项目列表(示例) 蚀刻的项目(样本) resultArray(我到底想要什么) 我的当前代码(工作) PS:我能够使用ES6/7语法/功能。像这样吗Javascript 筛选和克隆对象属性,javascript,arrays,node.js,object,Javascript,Arrays,Node.js,Object,我有两个对象数组:itemsList和itemsFetched。每个数组中的所有对象都具有相同的结构(nr个键/值)。其中一个键具有相同的“含义”,但名称不同(itemsList上的item\u id,itemsFetched上的id)。他们的价值观是一样的 我需要过滤项目列表数组,只保留项目id值等于项目蚀刻上的id值的对象。然后将itemsFetched数组(与item_id=id匹配)上的每个对象的键/值count复制(添加)到过滤数组中 我有一个有效的代码,但我确信这不是解决这个问题的最
var itemsList=[
{
“id”:0,
“名称”:“鸡蛋”,
“img”:http://www.serebii.net/pokemongo/items/egg.png"
},
{
“id”:1,
“名称”:“Pokeball”,
“img”:http://www.serebii.net/pokemongo/items/20pokeballs.png"
},
{
“id”:2,
“名称”:“大球”,
“img”:http://www.serebii.net/pokemongo/items/greatball.png"
},
{
“id”:401,
“名”:“香”,
“img”:http://www.serebii.net/pokemongo/items/incense.png"
},
{
“id”:901,
“名称”:“孵化器(无限制)”,
“img”:http://www.serebii.net/pokemongo/items/eggincubator.png"
}
];
var itemsFetched=[
{
“项目id”:1,
“计数”:50,
“看不见”:真实
},
{
“项目id”:401,
“计数”:2,
“看不见”:真实
},
{
“项目id”:901,
“计数”:1,
“看不见”:真实
}
]
设arr=[];
itemsFetched.forEach((项目)=>{
itemsList.forEach((item2)=>{
if(item.item_id==item2.id){
arr.push({
“id”:item.item_id,
“名称”:项目2.name,
“计数”:item.count,
“img”:项目2.img
});
}
});
});
控制台日志(arr)像这样编码
var itemsList=[
{
“id”:0,
“名称”:“鸡蛋”,
“img”:http://www.serebii.net/pokemongo/items/egg.png"
},
{
“id”:1,
“名称”:“Pokeball”,
“img”:http://www.serebii.net/pokemongo/items/20pokeballs.png"
},
{
“id”:2,
“名称”:“大球”,
“img”:http://www.serebii.net/pokemongo/items/greatball.png"
},
{
“id”:401,
“名”:“香”,
“img”:http://www.serebii.net/pokemongo/items/incense.png"
},
{
“id”:901,
“名称”:“孵化器(无限制)”,
“img”:http://www.serebii.net/pokemongo/items/eggincubator.png"
}
];
var itemsFetched=[
{
“项目id”:1,
“计数”:50,
“看不见”:真实
},
{
“项目id”:401,
“计数”:2,
“看不见”:真实
},
{
“项目id”:901,
“计数”:1,
“看不见”:真实
}
]
设arr=[];
itemsFetched.forEach((项目)=>{
itemsList.forEach((item2)=>{
if(item.item_id==item2.id){
arr.push({
“id”:item.item_id,
“名称”:项目2.name,
“计数”:item.count,
“img”:项目2.img
});
}
});
});
控制台日志(arr)
改进的一种方法是对..of
语句使用,而不是对内部循环使用forEach
。这有助于在id匹配后从循环中中断。没有直接的方法可以脱离forEach方法
let arr = [];
itemsFetched.forEach((item) => {
for (let item2 of itemsList) {
if (itemsFetched.item_id === itemsList.id) {
arr.push({
"id": itemsFetched.item_id,
"name": itemsList.name,
"count": itemsFetched.count,
"img": itemsList.img
});
break;
}
}
});
改进的一种方法是对..of
语句使用for,而不是对内部循环使用forEach
。这有助于在id匹配后从循环中中断。没有直接的方法可以脱离forEach方法
let arr = [];
itemsFetched.forEach((item) => {
for (let item2 of itemsList) {
if (itemsFetched.item_id === itemsList.id) {
arr.push({
"id": itemsFetched.item_id,
"name": itemsList.name,
"count": itemsFetched.count,
"img": itemsList.img
});
break;
}
}
});
对…使用。。。与Array#map
结合使用的
loop(ES6功能)
这使得在您第一次找到匹配项时返回
合并对象更加容易,这是一种逻辑优化,因为两个列表都不应包含多个具有给定id的条目
const result=itemsFetched.map(数据=>{
对于(让项目列表中的项目){
if(data.item_id==item.id){
返回{
id:item.id,
名称:item.name,
count:data.count,
img:item.img
}
}
}
})
片段:
const itemsList=[{
“id”:0,
“名称”:“鸡蛋”,
“img”:http://www.serebii.net/pokemongo/items/egg.png"
}, {
“id”:1,
“名称”:“Pokeball”,
“img”:http://www.serebii.net/pokemongo/items/20pokeballs.png"
}, {
“id”:2,
“名称”:“大球”,
“img”:http://www.serebii.net/pokemongo/items/greatball.png"
}, {
“id”:401,
“名”:“香”,
“img”:http://www.serebii.net/pokemongo/items/incense.png"
}, {
“id”:901,
“名称”:“孵化器(无限制)”,
“img”:http://www.serebii.net/pokemongo/items/eggincubator.png"
}]
常数项蚀刻=[{
“项目id”:1,
“计数”:50,
“看不见”:真实
}, {
“项目id”:401,
“计数”:2,
“看不见”:真实
}, {
“项目id”:901,
“计数”:1,
“看不见”:真实
}]
const result=itemsFetched.map(数据=>{
对于(让项目列表中的项目){
if(data.item_id==item.id){
返回{
id:item.id,
名称:item.name,
count:data.count,
img:item.img
}
}
}
})
console.log(结果)
使用来。。。与Array#map
结合使用的
loop(ES6功能)
这使得在第一次找到匹配项时返回
合并对象变得更加容易,这是一种逻辑优化,因为两个列表都不应包含多个具有gi的条目
[
{
"id": 1,
"name": "Pokeball",
"count": 50,
"img": "http://www.serebii.net/pokemongo/items/20pokeballs.png",
},
{
"id": 401,
"name": "Incense",
"count": 2,
"img": "http://www.serebii.net/pokemongo/items/incense.png"
},
{
"id": 901,
"name": "Incubator (Unlimited)",
"count": 1,
"img": "http://www.serebii.net/pokemongo/items/eggincubator.png"
}
]
let arr = [];
itemsFetched.forEach((item) => {
itemsList.forEach((item2) => {
if (item.item_id === item2.id) {
arr.push({
"id": item.item_id,
"name": item2.name,
"count": item.count,
"img": item2.img
});
}
});
});
let arr = [];
itemsFetched.forEach((item) => {
for (let item2 of itemsList) {
if (itemsFetched.item_id === itemsList.id) {
arr.push({
"id": itemsFetched.item_id,
"name": itemsList.name,
"count": itemsFetched.count,
"img": itemsList.img
});
break;
}
}
});
const itemsMap = itemsList.reduce((map, item) => {
map[item.id] = item
return map
}, {})
const results = itemsFetched
.filter((item) => itemsMap.hasOwnProperty(item.item_id))
.map((item) => ({
id: item.item_id,
name: itemsMap[item.item_id].name,
count: item.count,
img: itemsMap[item.item_id].img,
}))