2014-11-05 64 views
0

我有从我的服务器返回的数据数组。从这个数组我需要 获得主题的阵列和副主题的数组:如何过滤数组以删除重复条目?

var data = 
[ 
{"topicId":1,"subTopicId":1,"topicName":"J","subTopicName":" Ar"}, 
{"topicId":1,"subTopicId":2,"topicName":"J","subTopicName":" Us"}, 
{"topicId":1,"subTopicId":3,"topicName":"J","subTopicName":" Ut"}, 
{"topicId":2,"subTopicId":4,"topicName":"L","subTopicName":" Ov"}, 
{"topicId":2,"subTopicId":5,"topicName":"L","subTopicName":" El"}, 
{"topicId":2,"subTopicId":6,"topicName":"L","subTopicName":" In"}, 
{"topicId":2,"subTopicId":7,"topicName":"L","subTopicName":" Pr"}, 
{"topicId":2,"subTopicId":8,"topicName":"L","subTopicName":" Va"}, 
{"topicId":2,"subTopicId":9,"topicName":"L","subTopicName":" Pa"} 
] 

我有,我用它来格式化该数据,只是给我的主题信息代码:

var topics = data.map(function (t) { 
        return { 
         id: t.topicId, name: t.topicName 
        }; 
       }); 

但这给了我条目topicId 1和topidId 项2.

我怎样可以过滤掉重复的条目,所以我可以为examp以上只会给我一个两个条目的主题数组。每个topicId

请不要jQuery,lodash或其他框架解决方案,因为我没有在标签中包括这些。感谢

回答

1

这应该可以工作

topics = data.filter(function(item, index, data) { 
    for (var i = 0; i < data.length; i++) { 
     if (item.topicId === data[i].topicId) break; 
    } 

    return index === i; 
}).map(function (item) { 
    return { 
     id: item.topicId, 
     name: item.topicName 
    }; 
}); 

如果重复条目相同,则可以简化过滤功能

data.filter(function(item, index, data) { 
    return data.indexOf(item) === index; 
}) 
0

这里是解决方案:

var data = 
[ 
{"topicId":1,"subTopicId":1,"topicName":"J","subTopicName":" Ar"}, 
{"topicId":1,"subTopicId":2,"topicName":"J","subTopicName":" Us"}, 
{"topicId":1,"subTopicId":3,"topicName":"J","subTopicName":" Ut"}, 
{"topicId":2,"subTopicId":4,"topicName":"L","subTopicName":" Ov"}, 
{"topicId":2,"subTopicId":5,"topicName":"L","subTopicName":" El"}, 
{"topicId":2,"subTopicId":6,"topicName":"L","subTopicName":" In"}, 
{"topicId":2,"subTopicId":7,"topicName":"L","subTopicName":" Pr"}, 
{"topicId":2,"subTopicId":8,"topicName":"L","subTopicName":" Va"}, 
{"topicId":2,"subTopicId":9,"topicName":"L","subTopicName":" Pa"} 
] 

var arr = [], 
    collection = []; 

$.each(data, function (index, value) { 
    if ($.inArray(value.topicId, arr) == -1) { 
     arr.push(value.topicId); 
     collection.push(value); 
    } 
}); 
console.log(collection); 

这将打印以下到控制台:

enter image description here

0

试试这个

var topicIds = {}; 
var unique = []; 
topics.forEach(function(t){ 
     if(!topicIds[t.id]){ 
      unique.push(t); 
      topicIds[t.id] = true; 
     } 
}); 

unique将甲肝一系列独特的主题。

0

我建议使用underscore.js http://underscorejs.org/

智能图书馆它们实现类似功能的GroupBy行为http://underscorejs.org/#groupBy

所以,你可以简单地使用_.groupBy(data, function(t){return t.topicId;}),你会得到分组suptopics:

Object {1: Array[3], 2: Array[6]} 
1: Array[3] 
    [{ 
     subTopicId: 1 
     subTopicName: " Ar" 
     topicId: 1 
     topicName: "J" 
    },{ 
     subTopicId: 2 
     subTopicName: " Us" 
     topicId: 1 
     topicName: "J" 
    }, ... ]