【发布时间】:2017-04-26 06:29:47
【问题描述】:
我有 2 个对象数组:itemsList 和 itemsFetched。每个数组中的所有对象都具有相同的结构(nr 个键/值)。其中一个键具有相同的“含义”,但名称不同(itemsList 上的 item_id,itemsFetched 上的 id )。它们的值是相同的。
我需要过滤 itemsList 数组,只留下 item_id 值等于 上 id 值的对象itemsFetched。然后将 itemsFetched 数组(与 item_id=id 匹配)上每个对象的键/值 count 复制(添加)到过滤后的数组。
我有一个工作代码,但我确信这不是解决这个问题的最佳方法。我之前已经问过类似的问题(关于“过滤器”部分)解决了我的问题,但由于我必须在过滤后添加“计数”部分,我最终重构了整个事情。
itemsList(示例)
[
{
"id": 0,
"name": "Egg",
"img": "http://www.serebii.net/pokemongo/items/egg.png"
},
{
"id": 1,
"name": "Pokeball",
"img": "http://www.serebii.net/pokemongo/items/20pokeballs.png"
},
{
"id": 2,
"name": "Greatball",
"img": "http://www.serebii.net/pokemongo/items/greatball.png"
},
{
"id": 401,
"name": "Incense",
"img": "http://www.serebii.net/pokemongo/items/incense.png"
},
{
"id": 901,
"name": "Incubator (Unlimited)",
"img": "http://www.serebii.net/pokemongo/items/eggincubator.png"
}
]
itemsFetched(示例)
[
{
"item_id": 1,
"count": 50,
"unseen": true
},
{
"item_id": 401,
"count": 2,
"unseen": true
},
{
"item_id": 901,
"count": 1,
"unseen": true
}
]
resultArray(到底想要什么)
[
{
"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
});
}
});
});
PS:我能够使用 ES6/7 语法/功能。
【问题讨论】:
-
最好在服务器上做这个处理。始终将格式化的数据返回给浏览器。这样您就不必在需要这些数据的每个页面上执行相同的数据操作了。
-
是的,我知道这一点。这是在服务器端完成的。其中一个数组位于 json 文件及其模板类型上,另一个是对外部 api 调用的响应。
-
他尝试从数组中获取 id。这里--->> if (itemsFetched.item_id === itemsList.id)
-
为什么会有这么多垃圾邮件?我已经告诉过你,这不是问题。那是一个复制粘贴编辑错误。这里的问题是关于效率、最佳实践和 ES6/7 语法/特性的使用。大多数人似乎都明白这一点,除了你。
-
@nip 在这种情况下,kcats 有最好的答案。通过将数组转换为哈希集可以防止低效的嵌套循环。
标签: javascript arrays node.js object