Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 筛选和克隆对象属性_Javascript_Arrays_Node.js_Object - Fatal编程技术网

Javascript 筛选和克隆对象属性

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复制(添加)到过滤数组中 我有一个有效的代码,但我确信这不是解决这个问题的最

我有两个对象数组:itemsListitemsFetched。每个数组中的所有对象都具有相同的结构(nr个键/值)。其中一个键具有相同的“含义”,但名称不同(itemsList上的item\u iditemsFetched上的id)。他们的价值观是一样的

我需要过滤项目列表数组,只保留项目id值等于项目蚀刻上的id值的对象。然后将itemsFetched数组(与item_id=id匹配)上的每个对象的键/值count复制(添加)到过滤数组中

我有一个有效的代码,但我确信这不是解决这个问题的最佳方法。我之前已经问过类似的问题(关于“过滤器”部分),解决了我的问题,但是由于我必须在过滤之后添加“计数”部分,所以我最终重构了整个过程

项目列表(示例)

蚀刻的项目(样本)

resultArray(我到底想要什么)

我的当前代码(工作)

PS:我能够使用ES6/7语法/功能。

像这样吗

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,
    }))