web-dev-qa-db-ja.com

重複する値を持つ配列をJavascriptの一意の配列にマッピングするにはどうすればよいですか?

私は次の配列を持っています:

var tst = 
[
 {"topicId":1,"subTopicId":1,"topicName":"a","subTopicName":"w"},
 {"topicId":1,"subTopicId":2,"topicName":"b","subTopicName":"x"},
 {"topicId":1,"subTopicId":3,"topicName":"c","subTopicName":"y"},
 {"topicId":2,"subTopicId":4,"topicName":"c","subTopicName":"z"}
]

TopicId> idおよびtopicName> nameであるこの種類の配列にマッピングする簡単な方法はありますか?

var t = 
[
  {"id":1,"name":"a"},
  {"id":2,"name":"c"}
]

最新のブラウザを使用していますが、_lodashがあればそれも役立ちます。 tst配列には約100行あるため、非常に最適化されたソリューションは必要ありません。シンプルでメンテナンスしやすいソリューションがより重要です。

21
user1943020

最近の

_。uniqByが望ましい

ここで完全な動作例

var tst = [
 {"topicId":1,"subTopicId":1,"topicName":"a","subTopicName1":"w"},
 {"topicId":2,"subTopicId":2,"topicName":"b","subTopicName2":"x"},
 {"topicId":3,"subTopicId":3,"topicName":"c","subTopicName3":"y"},
 {"topicId":1,"subTopicId":4,"topicName":"c","subTopicName4":"z"}
];

var result = _.map(_.uniqBy(tst, 'topicId'), function (item) {
    return {
        id: item.topicId,
        name: item.topicName
    };  
});

console.log(result);

[〜#〜] legacy [〜#〜]

http://lodash.com/docs#uniq は良いスタートです

_.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');

IDで一意のトピックを取得するには、コードは次のようになります

var t = _.uniq(tst, 'topicId');

[〜#〜] edit [〜#〜]

私はjsfiddleを作りました

http://jsfiddle.net/q5HNw/

[〜#〜] update [〜#〜]

不要な名前の一意性を削除

http://jsfiddle.net/q5HNw/1/

33
axelduch

私はネイティブ関数を使用している人の一人です:)

var results = tst.reduce(function(res,topic){
var exists = res.some(function(t){ return (t.id === topic.topicId && t.name === topic.topicName);});        
     if (!exists){
        res.Push({"id": topic.topicId, "name": topic.topicName});
     }
return res; },[]);

Lodashバージョン

私はlodashを使用する専門家ではありません。おそらく次のようなものを試してみます。

var results = _.reduce(tst, function(res, topic){       
    var exists = _.findIndex(res, function(t){
        return (t.id === topic.topicId && t.name === topic.topicName);
    });
    if (exists === -1){
      res.Push({"id": topic.topicId, "name": topic.topicName});
    }
    return res; 
},[]);
2
Dalorzo