Array.push() en unieke items

Ik heb een simpel geval van het pushen van unieke waarden in een array. Het ziet er zo uit:

 this.items = [];
  add(item) {
    if(this.items.indexOf(item) > -1) {
      this.items.push(item);
      console.log(this.items);
    }
  }

Lijkt vrij eenvoudig, toch? Nee, zoals het lijkt. Het voegt geen waarden toe. Ik weet zeker dat het een domme fout van mijn kant is, maar ik kan het niet vinden.


Antwoord 1, autoriteit 100%

Ja, het is een klein foutje.

if(this.items.indexOf(item) === -1) {
    this.items.push(item);
    console.log(this.items);
}

Antwoord 2, autoriteit 51%

U kunt de Set-structuur van ES6 gebruiken om uw code sneller en beter leesbaar te maken:

// Create Set
this.items = new Set();
add(item) {
    this.items.add(item);
    // Set to array
    console.log([...this.items]);
}

Antwoord 3, autoriteit 11%

probeer .includes()

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true

dus zoiets als

const array = [1, 3];
if (!array.includes(2))
    array.push(2);

let echter op de browsercompatibiliteit onderaan de pagina.


Antwoord 4, autoriteit 6%

Als je Lodashgebruikt, kijk dan eens op _.unionfunctie:

let items = [];
items = _.union([item], items)

Antwoord 5, autoriteit 6%

In het geval dat u op zoek bent naar één voering

Voor primitieven

(this.items.indexOf(item) === -1) && this.items.push(item);

Voor objecten

this.items.findIndex((item: ItemType) => item.var === checkValue) === -1 && this.items.push(item);

Antwoord 6, autoriteit 5%

Je logica zegt: “Als dit item al bestaat, voeg het dan toe.” Het zou het tegenovergestelde moeten zijn.

Wijzig het in…

if (this.items.indexOf(item) == -1) {
    this.items.push(item);
}

Antwoord 7, autoriteit 5%

Ik denk dat ES6 een datastructuur heeft ingesteld, die je kunt gebruiken voor unieke items


Antwoord 8, autoriteit 4%

Set

gebruiken

this.items = new Set();
this.items.add(1);
this.items.add(2);
this.items.add(1);
this.items.add(2);
console.log(Array.from(this.items)); // [1, 2]

Antwoord 9, autoriteit 2%

Je moet === -1 gebruiken, als het gelijk is aan -1, d.w.z. item is niet beschikbaar in je array:

 this.items = [];
  add(item) {
    if(this.items.indexOf(item) === -1) {
      this.items.push(item);
      console.log(this.items);
    }
  }

Antwoord 10

Duw altijd unieke waarde in array

ab = [
     {"id":"1","val":"value1"},
     {"id":"2","val":"value2"},
     {"id":"3","val":"value3"}
   ];
var clickId = [];
var list = JSON.parse(ab);
$.each(list, function(index, value){
    if(clickId.indexOf(value.id) < 0){
        clickId.push(value.id);
    }
});

Antwoord 11

var helper = {};
for(var i = 0; i < data.length; i++){
  helper[data[i]] = 1; // Fill object
}
var result = Object.keys(helper); // Unique items

Antwoord 12

dus ik weet niet zeker of dit je vraag beantwoordt, maar de index van de items die je toevoegt, blijft -1 retourneren. Niet bekend met js, maar het lijkt erop dat de items dat doen omdat ze nog niet in de array staan. Ik heb een jsfiddle van een beetje aangepaste code voor je gemaakt.

this.items = [];
add(1);
add(2);
add(3);
document.write("added items to array");
document.write("<br>");
function  add(item) {
        //document.write(this.items.indexOf(item));
    if(this.items.indexOf(item) <= -1) {
      this.items.push(item);
      //document.write("Hello World!");
    }
}
document.write("array is : " + this.items);

https://jsfiddle.net/jmpalmisano/Lnommkbw/2/

Other episodes