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;
}
}
「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;
}
rex0220様
forEachにてidをキーとした別のオブジェクトを作成しながら、
既に存在するかをチェックし、存在すれば値をインクルメント。
作成したidsからfilterで値が1以上のものを配列で取得し、lengthで重複したかを確認する。
という流れと理解しました。
やはりfor2重は負荷が高いのですね。
大変参考になりました。ありがとうございました。