我有一个对象数组,我只想根据它们的对象 ID 返回唯一的对象。
我试图在现有数组中循环,data然后查找元素是否已经添加到新创建的数组中arr,该数组应该只包含唯一值,但它对我不起作用,我相信我在这里或那里遗漏了一些东西.
这是当前数组:
[
{
"objectId": "WMtwbyhFI6",
"cuisineNameEn": "Cafe",
"ordersNo": 20,
"hidden": false
},
{
"objectId": "QJSNTMpq5F",
"ordersNo": 24,
"cuisineNameEn": "Italian",
"hidden": false
},
{
"objectId": "iLXKswFRGa",
"ordersNo": 5,
"cuisineNameEn": "Japanese",
"hidden": true
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
},
{
"objectId": "QJSNTMpq5F",
"ordersNo": 24,
"cuisineNameEn": "Italian",
"hidden": false
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false,
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
}
]
Run Code Online (Sandbox Code Playgroud)
但是,这就是我想要返回的内容:
[
{
"objectId": "WMtwbyhFI6",
"cuisineNameEn": "Cafe",
"ordersNo": 20,
"hidden": false
},
{
"objectId": "iLXKswFRGa",
"ordersNo": 5,
"cuisineNameEn": "Japanese",
"hidden": true
},
{
"objectId": "Db0MeihpJE",
"ordersNo": 6,
"cuisineNameEn": "Fast Food",
"hidden": false
},
{
"objectId": "QJSNTMpq5F",
"ordersNo": 24,
"cuisineNameEn": "Italian",
"hidden": false
}
]
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
var arr = [];
data.forEach((el)=>{
if (arr.indexOf(el.objectId) === -1) {
arr.push(el)
}
})
Run Code Online (Sandbox Code Playgroud)
然而,它没有用。
使用reduce()方法:
data.reduce((acc, x) =>
acc.concat(acc.find(y => y.ordersNo === x.ordersNo) ? [] : [x])
, []);
Run Code Online (Sandbox Code Playgroud)
reduce遍历数组,对于每个元素,它使用累加器(前一次调用的返回值)和当前元素调用提供的函数。concat如果当前元素尚不存在,则将当前元素添加到累加器中。find通过比较ordersNo属性检查当前元素是否存在于累加器中。
演示:
data.reduce((acc, x) =>
acc.concat(acc.find(y => y.ordersNo === x.ordersNo) ? [] : [x])
, []);
Run Code Online (Sandbox Code Playgroud)