所以我有一个这样的值数组
const foodsList = [
{
foodOrigin: "Padang",
foodName: "Nasi Padang",
originCode: "PDN"
},
{
foodOrigin: "Padang",
foodName: "Gulai",
originCode: "PDN"
},
{
foodOrigin: "Padang",
foodName: "Rendang",
originCode: "PDN"
},
{
foodOrigin: "Palembang",
foodName: "Pempek",
originCode: "PLG"
},
{
foodOrigin: "Palembang",
foodName: "Tekwan",
originCode: "PLG"
},
{
foodOrigin: "Yogyakarta",
foodName: "Gudeg",
originCode: "YKT"
}
];
我想对数组进行过滤,结果会是这样的
const filteredFoodsList = [
{
foodOrigin: "Padang",
originCode: "PDN"
},
{
foodOrigin: "Palembang",
originCode: "PLG"
},
{
foodOrigin: "Yogyakarta",
originCode: "YKT"
}
];
为了达到这个效果,我试着像下面这样做,但有没有更干净更好的方法来做到这一点?(特别是因为我的实际数组的数据由500多个组成)
const filteredFoodsList = [];
for (let i = 0; i < foodsList.length; i++) {
if (i === 0) {
filteredFoodsList.push({
originCode: foodsList[i].originCode,
foodOrigin: foodsList[i].foodOrigin
});
}
let isExist = false;
for (let j = 0; j < filteredFoodsList.length; j++) {
if (foodsList[i].originCode === filteredFoodsList[j].originCode) {
isExist = true;
}
}
if (!isExist) {
filteredFoodsList.push({
originCode: foodsList[i].originCode,
foodOrigin: foodsList[i].foodOrigin
});
}
}
6条答案
按热度按时间wztqucjr1#
正如OP所述,应该关注性能,所以...
Map
可能是收集唯一值的最快方法。(我从Nina的答案中借用了
Array.from(map, ([originCode, foodOrigin]) => ({ foodOrigin, originCode }))
,非常优雅)。但它不会影响性能,因为生成的数组应该很小。
但是她忘了包括一个
Map::has()
检查,这确实显著提高了性能。重要的是迭代源数组的速度。像往常一样,我看到不可能有比
for(let i = 0; ...)
更快的东西...还有一个基准:
eufgjt7s2#
可以使用对象来存储值
qeeaahzv3#
你可以取一个
Map
并从中得到一个新数组。vkc1a9a24#
以下是我的“老式”方法,不使用
Map
:brccelvz5#
OP不执行
filter
,因为不仅数组受影响,而且数组项的每个数据结构也受影响。它也不是map
ping,后者将允许后者(更改项的数据),但始终确保数组项的数量相同。过滤和修改数据的组合是一个经典的
reduce
任务。至于OP的问题,不仅需要从源数组中提取唯一的项目数据,还需要实现一个更防弹的解决方案,因为可能会出现不正确的数据,如...
...与它的正确符号...
为了达到最少的迭代工作量,可以实现一个
reduce
任务,方法是将一个基于对象的初始值作为reduce
方法的第二个参数传递,该初始值具有两个键值对,其中lookup
-key保存Map
-reference,result
-key引用数组。在每次迭代中,回调reducer函数接收这样一个对象作为其第一个参数。它还必须返回这样一个对象,要么对其数据进行更改,要么不进行更改。对象的
Map
引用将被用作查找特定数据是否已经被处理的最快可能方法之一。该实现将使用map的has
方法。如果感兴趣的数据项尚未被处理,则可以在基于
Map
的lookup
处set
项特定条目。此外,还将创建一个新的、目标数据特定的对象,并将其推入result
数组。后者还以
reduce
任务的返回值为最终结果。nukf8bse6#
您可以按如下方式使用
Array.reduce
: