将逗号分隔字符串数组转换为不同的数组
Turn array of comma delimited strings into distinct array
我想取一个对象数组:
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'}
];
并返回所有"seenby"用户的不同数组:
var seenByArr = ['user1', 'user2', 'user3', 'user4']
我不知道如何有效地(尽可能少的行(将其转换为不同值的数组。请查看我的小提琴示例:https://jsfiddle.net/ksumarine/ss3v7dgj/
我意识到这个问题没有提到下划线,但值得一提的是,Underscore.js是一个非常流行的用于操作对象和数组的库,非常适合这种事情。
下面是一个大而不可读的单行,用于使用下划线实现此目的:
_.unique(_.flatten(_.map(_.pluck(objArr, 'seenby'), function(seenby) { return seenby.split(', '); })))
具有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"]
您可以尝试以下
$.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());
}
});
});
供参考 - https://jsfiddle.net/ss3v7dgj/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>');
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();
有一天我可能会找到这个的用处...
我会使用 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
项,下一个地图将遍历所有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
(初始化为空数组[]
- 然后我们从数组中过滤掉重复项(通过检查项目的索引是否与当前索引相同(
相关文章:
- 使用JS将数组转换为json对象
- 本地存储中的字符串到字节数组转换
- Javascript函数,用于将数组转换为“;2-元组”;
- php数组转换为javascript
- 在Javascript中将一个值和字符串数组转换为if语句
- 将数组转换为javascript格式的字符串
- 如何将数组转换为有效的json
- JSON数组转换为JS对象数组
- 如何将数组转换为映射
- JavaScript:将字符串数组转换为文本区域
- javascript |数组转换
- 数组转换为多个字符串
- Javascript将数组转换为字符串并使其反向输出
- 将Byte数组转换为Angularjs中的Base64字符串
- 将对象数组转换为与nodejs/pg/unnest兼容的数组
- 将Javascript数组转换为PHP数组
- 将数组转换为键值对
- 使用Ramda将对象数组转换为普通对象
- javascript将对象数组转换为字符串以存储在s3中
- 使用.join方法将数组转换为不带逗号的字符串