将逗号分隔的字符串数组转换为不同的数组

时间:2016-02-16 19:11:09

标签: javascript jquery

我想拍摄一系列物品:

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/

6 个答案:

答案 0 :(得分:3)

我意识到这个问题并没有提到Underscore,但值得一提的是Underscore.js是一个非常受欢迎的库,用于操作对象和数组,非常适合这种事情。

这是使用Underscore实现这一目标的一条难以理解的单线:

_.unique(_.flatten(_.map(_.pluck(objArr, 'seenby'), function(seenby) { return seenby.split(', '); })))

答案 1 :(得分:2)

具有String.splitArray.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());
        }
    });
});

供参考 - https://jsfiddle.net/ss3v7dgj/1/

答案 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(初始化为空数组[]
  • 然后我们从数组中过滤掉重复项(通过检查项目的索引是否与当前索引相同)