我有一个看起来像这样的对象:
const posts = [
{ id: 0, user: { id: 5564, name: 'john'} },
{ id: 1, user: { id: 5564, name: 'john'} },
{ id: 2, user: { id: 5560, name: 'jane'} }
]
我需要像这样的唯一用户哈希数组:
[
{ id: 5564, name: 'john'},
{ id: 5560, name: 'jane'}
]
我可以通过以下方法从posts数组中检索所有用户属性:
const postUsers = posts.map(post => post.user)
返回:
[
{ id: 5564, name: 'john'},
{ id: 5564, name: 'john'},
{ id: 5560, name: 'jane'}
]
用户john被列出两次的地方
我已经能够通过以下操作获得所需的结果:
const unique = {};
const uniqueUsers = [];
for(var i in postUsers){
if(typeof(unique[postUsers[i].id]) == "undefined"){
uniqueUsers.push(postUsers[i]);
}
unique[postUsers[i].id] = 0;
};
uniqueUsers
,但是必须有一种更清洁的方法。 通过执行以下操作,我还可以返回所有用户的唯一ID:
var ids = posts.map(post => post.user.id)
var uniqueIds = Array.from(new Set(ids)).sort();
哪个返回
[5564, 5560]
不确定是否有帮助。这篇文章对我有所帮助https://medium.com/tomincode/removing-array-duplicates-in-es6-551721c7e53f
答案 0 :(得分:0)
您可以使用Map
并仅获得唯一身份用户。
const
posts = [{ id: 0, user: { id: 5564, name: 'john'} }, { id: 1, user: { id: 5564, name: 'john'} }, { id: 2, user: { id: 5560, name: 'jane'} }],
unique = Array.from(posts.reduce((m, { user }) => m.set(user.id, user), new Map).values());
console.log(unique);
答案 1 :(得分:0)
如果您不介意使用lodash,则可以执行
之类的操作const users = _map.(posts, 'user') // To get the list of users
_.uniqBy(users, 'id') // to get the uniq ones
答案 2 :(得分:0)
将对象直接放在uniqueUsers
中,然后最后使用Object.values()
将对象转换为数组。
const posts = [
{ id: 0, user: { id: 5564, name: 'john'} },
{ id: 1, user: { id: 5564, name: 'john'} },
{ id: 2, user: { id: 5560, name: 'jane'} }
];
let uniqueUsers = {};
posts.forEach(({user}) => uniqueUsers[user.id] = user);
uniqueUsers = Object.values(uniqueUsers);
console.log(uniqueUsers);
答案 3 :(得分:0)
使用reduce通过检查数组中是否已存在该值来缩小数组。如果它已经在数组中,请返回数组的当前状态,否则将该项添加到数组中。
const posts = [
{ id: 0, user: { id: 5564, name: 'john'} },
{ id: 1, user: { id: 5564, name: 'john'} },
{ id: 2, user: { id: 5560, name: 'jane'} }
]
const r = posts.map(i => i.user).reduce((acc, itm) => {
return !acc.find(i => i.id == itm.id) && acc.concat(itm) || acc
}, [])
console.log(r)