我有一个包含重复的元素网的数组
let myArray=[
{role: "role-1", deviceId: ""},
{role: "role-2", deviceId: "d-2"},
{role: "role-3", deviceId: "d-3"},
{role: "role-1", deviceId: "d-1"},
{role: "role-2", deviceId: ""},
{role: "role-4", deviceId: ""}
{role: "role-5", deviceId: ""}
]
我想删除重复的角色,并拥有包含不带Empty(“”)deviceIds的角色的数组,如果deviceId为空,则只保留一个不带重复的角色
myArray=[
{role: "role-1", deviceId: "d-1"},
{role: "role-2", deviceId: "d-2"},
{role: "role-3", deviceId: "d-3"}
{role: "role-4", deviceId: ""}
{role: "role-5", deviceId: ""}
]
我已经以这种方式编写了函数
function dedupeByKey(arr, key) {
const temp = arr.map(el => el[key]);
return arr.filter((el, i) =>
temp.indexOf(el[key]) === i
);
}
console.log(dedupeByKey(myArray, 'role'));
但是结果是,它没有添加带有空设备ID的值和角色的设备ID的优先级检查。如何解决这个问题?
您可以在默认情况下将reduce用于对象,如果需要,可以在最后将其转换为数组。
let myArray = [
{role: "role-1", deviceId: ""},
{role: "role-2", deviceId: "d-2"},
{role: "role-3", deviceId: "d-3"},
{role: "role-1", deviceId: "d-1"},
{role: "role-2", deviceId: ""},
{role: "role-4", deviceId: ""},
{role: "role-5", deviceId: ""}
]
const res = myArray.reduce((agg, itr) => {
if (agg[itr.role]) return agg // if deviceId already exist, skip this iteration
agg[itr.role] = itr.deviceId // if deviceId not exist, Add it
return agg
}, {})
let make_array = Object.keys(res).map(key => { return { role: key, deviceId: res[key] }})
console.log(make_array)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句