ES6哈希数组返回唯一的哈希数组

时间:2019-07-01 21:03:23

标签: javascript arrays ecmascript-6

我有一个看起来像这样的对象:

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

4 个答案:

答案 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)