我想拍摄一系列物品:
var objArr = [
{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 seenByArr = ['user1', 'user2', 'user3', 'user4']
我无法弄清楚如何有效地(尽可能少的行)将其变成一组不同的值。请查看我的小提琴,获取示例:https://jsfiddle.net/ksumarine/ss3v7dgj/
答案 0 :(得分:3)
我意识到这个问题并没有提到Underscore,但值得一提的是Underscore.js是一个非常受欢迎的库,用于操作对象和数组,非常适合这种事情。
这是使用Underscore实现这一目标的一条难以理解的单线:
_.unique(_.flatten(_.map(_.pluck(objArr, 'seenby'), function(seenby) { return seenby.split(', '); })))
答案 1 :(得分:2)
具有String.split
和Array.foreach
功能的简洁解决方案:
var arr = [];
objArr.forEach(function (obj) {
var str = obj.seenby.split(',');
str.forEach(function (v) {
var user = v.trim();
if (arr.indexOf(user) === -1) arr.push(user);
});
});
console.log(arr);
// the output:
["user1", "user2", "user3", "user4"]
答案 2 :(得分:1)
您可以尝试以下
$.each(list, function(index, value) {
$.each(value.seenby.split(","), function(i, val) {
if (val !== undefined && val.trim() !== "" && arr.indexOf(val.trim()) == -1) {
arr.push(val.trim());
}
});
});
答案 3 :(得分:1)
普通Javascript中的解决方案,包含IIFE和项目的临时对象。
var objArr = [{ 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' }],
result = function (array) {
var obj = {}, r = [];
array.forEach(function (a) {
a.seenby.split(', ').forEach(function (b) {
obj[b] = obj[b] || r.push(b);
});
});
return r;
}(objArr);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
答案 4 :(得分:1)
given = function (x) {
return {
do: function (f) { x = f(x); return this },
return: function () { return x }
}
};
r = given(objArr)
.do(x => x.map(y => y.seenby))
.do(x => [].concat.apply([], x))
.do(x => x.join(', '))
.do(x => x.split(', '))
.do(x => x.filter((e, i) => x.indexOf(e) === i))
.do(x => x.sort())
.return();
总有一天我可能会用到这个......
答案 5 :(得分:1)
我会使用Array.prototype.map
函数,并在关联数组中重复删除用户。所以这里有趣的部分,但您也可以尝试here:
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
项,下一个映射将遍历所有seenby
项。然后,我们收集arr
中的用户,通过将其用作关联数组进行重复数据删除。
最后,我们使用Object.keys
函数提取所有关联数组键。
小小的警告是,此解决方案仅在map函数存在时才有效,如果不存在,则需要自己实现。但通常你使用足够新的JavaScript版本来支持它。这个解决方案还有一个很好的副作用,你不需要任何外部依赖(当然除了显示它)
<强>更新强> 我认为最好是following way:
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
(初始化为空数组[]
)