2014-11-05 63 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" 
    }, ... ]