27

I need to have the index of an object in array so I can delete this part of the array. I tried using this:

var index = this.urenRegistratie.indexOf(newDatum);

But it keeps returning -1 and I don't know why this is happening.

this is the part of the code I have. it gets data out of a form in html and places that into my array, now I already have an if statement ready ( exisitingDatum ) , my code needs to be in there. Can someone please help me out a bit?

 store(newValue:number, newDatum, newAanwezig, newComment){
    const existingDatum = this.urenRegistratie.find(billable => {
      return billable.datum === newDatum;
      return
    });

    if (!existingDatum) {
        let billable = new BillableHours();
        billable.datum = newDatum;
        billable.hours = +newValue;
        billable.aanwezig = newAanwezig;
        billable.comment = newComment;

        if(billable.aanwezig == "Aanwezig" && billable.hours !== 0 && billable.datum !== null) {
          this.urenRegistratie.push(billable);
        }
    }

    if(existingDatum) {

    }

  }
stan
  • 348
  • 1
  • 3
  • 13

5 Answers5

47

As mdn says:

The findIndex() method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating that no element passed the test.

If you have array of objects like this, then try to use findIndex:

const a = [
    { firstName: "Adam", LastName: "Howard" },
    { firstName: "Ben", LastName: "Skeet" },
    { firstName: "Joseph", LastName: "Skeet" }
];

const index = a.findIndex(x => x.LastName === "Skeet");
console.log(index);
StepUp
  • 36,391
  • 15
  • 88
  • 148
4

Adding to the answer of @StepUp (and please select his answer as best, as it replies the question greatly):

Finding the index is not related to Angular, it is rather Vanilla JavaScript.

In your case, you need a function that has as parameter the newDatum "needle" to be searched in the array "haystack" using findIndex:

var getNewDatumIndex = (array, newDatumNeedle) => {
  return array.findIndex(x => x.newDatum === newDatumNeedle); 
}

You can also add the method in the array prototype if you want, in order to ommit the first argument:

Array.prototype.getNewDatumIndex = (newDatumNeedle) => {
  return this.findIndex(x => x.newDatum === newDatumNeedle); 
}
Nick Louloudakis
  • 5,856
  • 4
  • 41
  • 54
2

An easy and elegant solution is to use _.isEqual, which performs a deep comparison using lodash library

Npm Package -- https://www.npmjs.com/package/lodash

const a = [
   { firstName: "Adam", LastName: "Howard" },
   { firstName: "Ben", LastName: "Skeet" },
   { firstName: "Joseph", LastName: "Skeet" }
];
const find =  { firstName: "Joseph", LastName: "Skeet" }

index = a.findIndex(x => _.isEqual(x, find));

console.log(index);
Amit Sharma
  • 668
  • 1
  • 6
  • 14
0

store(newValue: number, newDatum, newAanwezig, newComment) { let index = this.urenRegistratie.indexOf(existingDatum);

const existingDatum = this.urenRegistratie.find(billable => {
  return billable.datum === newDatum;
  return
});

if (index != -1) {
  let index = this.urenRegistratie.indexOf(existingDatum);
  existingDatum.splice(index, 1)
} else {

  let billable = new BillableHours();
  billable.datum = newDatum;
  billable.hours = +newValue;
  billable.aanwezig = newAanwezig;
  billable.comment = newComment;

  if (billable.aanwezig == "Aanwezig" && billable.hours !== 0 && billable.datum !== null) {
    this.urenRegistratie.push(billable);
  }
}

}

mani
  • 1
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Mar 10 '22 at 09:50
-1

sometimes, if you compare by id, you need to parseint, cause object's id is a string. care of this

  • 1
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Dec 29 '22 at 17:55