新規投稿
フォローする

オブジェクト配列の重複チェック

var data =[ 
{ id:”001”, simei:”佐々木”, class:”1組”},
{ id:"002", simei:"青木", class: "2組"},
{ id:"003", simei:"佐藤", class:"2組"},
{ id:"003", simei:"鈴木", class:"1組"},
];

上記のようにidが重複しているものを抜き出したいです。
filterとindexof利用すればいいのかなと思うのですが、該当するサンプルなどが
上手く見つけられません。
というか、{}やifなどが省略されており、似たようなソースを書き換えるレベルに達しておりません。

今はforを2重でまわして判定しています。

    for (let i = 0; i < data .length; i++) {
      let count = 0;
      for (let k = 0; k < data .length; k++) {
        if (data [i].fieldCode.value === data [k].fieldCode.value) {
          count++;
        }
      }
      if (count > 1) {
        event.error = '重複';
        return event;
      }
    }
0

2件のコメント

Avatar
rex0220

「forを2重」だと、データ数が増えるとかなりループ回数が増えます。

「idが重複しているものを抜き出したい」とのことですから、下記のような感じでどうですか?

 

var data =[
{ id:"001", simei:"佐々木", class:"1組"},
{ id:"002", simei:"青木", class: "2組"},
{ id:"003", simei:"佐藤", class:"2組"},
{ id:"003", simei:"鈴木", class:"1組"},
];
var ids = {};
data.forEach(function(xx) {
if (ids[xx.id])
ids[xx.id]++;
else
ids[xx.id] = 1;
});
var edata = Object.keys(ids).filter(function(id) {
return ids[id]>1;
});
if (edata.length > 0) {
console.log ('error data', edata);
event.error = '重複';
return event;
}

 

0
Avatar
まちだ

rex0220様

forEachにてidをキーとした別のオブジェクトを作成しながら、
既に存在するかをチェックし、存在すれば値をインクルメント。
作成したidsからfilterで値が1以上のものを配列で取得し、lengthで重複したかを確認する。

という流れと理解しました。

やはりfor2重は負荷が高いのですね。
大変参考になりました。ありがとうございました。

 

0
ログインしてコメントを残してください。