我会使用
Array.prototype.map
函数,并在关联数组中去重用户。这里是有趣的部分,但你也可以在
这里尝试一下:
var list = [
{id:1, name:'test', seenby:'user1, user2, user3'},
{id:2, name:'test1', seenby:'user3, user4'},
{id:3, name:'test2', seenby:'user1, user3'},
{id:4, name:'test3', seenby:'user2'}
];
var arr = [];
list.map(function(value){
value.seenby.split(",").map(function(val){
arr[val.trim()] = 1;
});
});
var seenby = Object.keys(arr);
它是如何工作的?
map
函数将迭代所有
list
项,下一个map将迭代所有
seenby
项。然后我们通过将其用作关联数组来收集
arr
中的用户,从而进行去重。
最后,我们使用
Object.keys
函数提取所有关联数组键。
小注意点是,如果不存在map函数,则此解决方案仅适用,否则您需要自己实现它。但通常您使用的是足够新的支持它的JavaScript版本。此解决方案还具有一个好的副作用,即您实际上不需要任何外部依赖项(当然除了显示它)。
更新:
我认为按照
以下方式执行更好:
var arr = list
.reduce(function(acc, value){
return acc.concat(value.seenby.split(",").map(function(val){
return val.trim()
}))},[])
.filter(function(item, index, array) {
return array.indexOf(item) === index
}
)
说明:
- 我们取出列表中的每一项,对其进行缩减...
- 从每一项中提取
seenby
字段
- 我们对该字段进行
split
操作
- 我们将每个项
map
为trim
- ...我们将返回的
seenby
数组连接到我们的累加器数组arr
中(该数组初始化为空数组[]
)
- 然后我们从数组中过滤掉重复项(通过检查一个项目的索引是否与当前索引相同来实现)