web-dev-qa-db-ja.com

オブジェクトの配列に重複したプロパティ値があるかどうかを確認するにはどうすればよいですか?

配列を反復処理するのに助けが必要です。動かなくなったり、車輪を再発明し続けています。

values = [
    { name: 'someName1' },
    { name: 'someName2' },
    { name: 'someName1' },
    { name: 'someName1' }
]

配列に2つ(またはそれ以上)の同じ名前の値があるかどうかを確認するにはどうすればよいですか?カウンターは必要ありません。配列の値が一意でない場合に変数を設定するだけです。配列の長さは動的であり、配列の値でもあることに注意してください。

40
be-codified

array.prototype.map および array.prototype.some を使用します。

var values = [
    { name: 'someName1' },
    { name: 'someName2' },
    { name: 'someName4' },
    { name: 'someName2' }
];

var valueArr = values.map(function(item){ return item.name });
var isDuplicate = valueArr.some(function(item, idx){ 
    return valueArr.indexOf(item) != idx 
});
console.log(isDuplicate);

JSFIDDLE。

54
Amir Popovich

ECMA Script 6バージョン

ECMA Script 6の Set をサポートする環境にいる場合は、このように Array.prototype.someSetオブジェクトを使用できます

let seen = new Set();
var hasDuplicates = values.some(function(currentObject) {
    return seen.size === seen.add(currentObject.name).size;
});

ここでは、各オブジェクトのnameSetに挿入し、追加前後のsizeが同じかどうかを確認します。これは、Set.sizeが一意のデータに基づいて数値を返すために機能します(データが一意である場合にのみセットがエントリを追加します)。重複する名前がある場合、サイズが増加することはありません(データが一意ではないため)。つまり、現在の名前が既に表示されていて、trueを返します。


ECMA Script 5バージョン

Setサポートがない場合は、次のように通常のJavaScriptオブジェクト自体を使用できます

var seen = {};
var hasDuplicates = values.some(function(currentObject) {

    if (seen.hasOwnProperty(currentObject.name)) {
        // Current name is already seen
        return true;
    }

    // Current name is being seen for the first time
    return (seen[currentObject.name] = false);
});

同じことがこのように簡潔に書けます

var seen = {};
var hasDuplicates = values.some(function (currentObject) {
    return seen.hasOwnProperty(currentObject.name)
        || (seen[currentObject.name] = false);
});

注:どちらの場合も、短絡するためArray.prototype.someを使用します。関数から真実の値を取得すると、すぐにtrueを返し、残りの要素は処理しません。

37
thefourtheye

単純な配列に重複があるかどうかを知るために、同じ値のfirstlastインデックスを比較できます:

関数:

var hasDupsSimple = function(array) {

    return array.some(function(value) {                            // .some will break as soon as duplicate found (no need to itterate over all array)
       return array.indexOf(value) !== array.lastIndexOf(value);   // comparing first and last indexes of the same value
    })
}

テスト:

hasDupsSimple([1,2,3,4,2,7])
// => true

hasDupsSimple([1,2,3,4,8,7])
// => false

hasDupsSimple([1,"hello",3,"bye","hello",7])
// => true

オブジェクトの配列の場合、最初にオブジェクトの値を単純な配列に変換する必要があります。

mapを使用して、オブジェクトの配列を単純な配列に変換します。

var hasDupsObjects = function(array) {

  return array.map(function(value) {
    return value.suit + value.rank

  }).some(function(value, index, array) { 
       return array.indexOf(value) !== array.lastIndexOf(value);  
     })
}

テスト:

var cardHand = [
  { "suit":"spades", "rank":"ten" },
  { "suit":"diamonds", "rank":"ace" },
  { "suit":"hearts", "rank":"ten" },
  { "suit":"clubs", "rank":"two" },
  { "suit":"spades", "rank":"three" },
]

hasDupsObjects(cardHand);
// => false

var cardHand2 = [
  { "suit":"spades", "rank":"ten" },
  { "suit":"diamonds", "rank":"ace" },
  { "suit":"hearts", "rank":"ten" },
  { "suit":"clubs", "rank":"two" },
  { "suit":"spades", "rank":"ten" },
]

hasDupsObjects(cardHand2);
// => true
2

簡単なループを試してください:

var repeat = [], tmp, i = 0;

while(i < values.length){
  repeat.indexOf(tmp = values[i++].name) > -1 ? values.pop(i--) : repeat.Push(tmp)
}

デモ

ブール値を探している場合、最も簡単な方法は

var values = [
    { name: 'someName1' },
    { name: 'someName2' },
    { name: 'someName1' },
    { name: 'someName1' }
]

// solution
var hasDuplicate = false;
values.map(v => v.name).sort().sort((a, b) => {
  if (a === b) hasDuplicate = true
})
console.log('hasDuplicate', hasDuplicate)
2
user2167582

map を使用して名前だけを返し、次にこの forEach トリックを使用して、少なくとも2回存在するかどうかを確認できます。

var areAnyDuplicates = false;

values.map(function(obj) {
    return obj.name;
}).forEach(function (element, index, arr) {
    if (arr.indexOf(element) !== index) {
        areAnyDuplicates = true;
    }
});

フィドル

1
Omri Aharon

nderscore.jsを使用 Underscoreを使用していくつかの方法を実行できます。ここにそれらの1つがあります。配列が既に一意であるかどうかを確認します。

function isNameUnique(values){
    return _.uniq(values, function(v){ return v.name }).length == values.length
}

バニラJavaScriptを使用配列に繰り返しの名前がないかどうかを確認します。

function isNameUnique(values){
    var names = values.map(function(v){ return v.name });
    return !names.some(function(v){ 
        return names.filter(function(w){ return w==v }).length>1 
    });
}
1
TaoPR
//checking duplicate elements in an array
var arr=[1,3,4,6,8,9,1,3,4,7];
var hp=new Map();
console.log(arr.sort());
var freq=0;
for(var i=1;i<arr.length;i++){
// console.log(arr[i-1]+" "+arr[i]);
if(arr[i]==arr[i-1]){
freq++;

}
else{
hp.set(arr[i-1],freq+1);
freq=0;
}
}
console.log(hp);
1
ravi