Javascript: Hur kontrollerar man om en array av objekt har ett och endast ett objekt med ett givet värde?


Jag vet att jag i Javascript kan använda .some eller .every på arrayer för att kontrollera om de har minst ett objekt eller varje objekt som klarar testet som implementeras av den angivna funktionen.

Här är några exempel:

[2, 5, 8, 1, 4].some(x => x > 10);  // false
[12, 5, 8, 1, 4].some(x => x > 10); // true

[12, 5, 8, 130, 44].every(x => x >= 10); // false
[12, 54, 18, 130, 44].every(x => x >= 10); // true

Jag letar efter ett sätt att kontrollera om en array har "en och endast en" post som uppfyller den givna funktionen. Jag skulle vilja ha en metod som följande:

[12, 5, 12, 13, 4].oneAndOnlyOne(x => x >= 10); // false
[2, 11, 6, 1, 4].oneAndOnlyOne(x => x >= 10); // true

Känner du till något nytt ECMA Script 6-sätt eller något enkelt/snabbt sätt, även med lodash, för att kontrollera om det i en array finns en och endast en förekomst av ett objekt som har vissa värden?

Svar #1

Du kan uppnå önskat resultat med Array#filter.

const oneAndOnlyOne = arr => arr.filter(v => v >= 10).length == 1;

console.log(oneAndOnlyOne([12, 5, 12, 13, 4]));
console.log(oneAndOnlyOne([2, 11, 6, 1, 4]));

Svar #2

Förmodligen är den mest effektiva lösningen den enkla loopen:

function findOne(arr) {
  var foundOne = false;
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] > 10)
      if(foundOne) return false;
      else foundOne = true;
  }
  return foundOne;
}

Det finns några verktyg där ute som redan gör detta. Som ramda till exempel. Du kan bara hitta ett som passar dig.