I want to use splice() with a 'for...of' loop.
Here is what I want to do but with a regular 'for' loop:
let celebritiesResult = JSON.parse(celebrityRecognitionJSONFile);
let celebritiesMap = {}
const timestampTolerance = 1000;
const confidenceTolerance = 90;
for (let j = 0; j < celebritiesResult.length;) {
let celebrity = celebritiesResult[j];
let prevCelebrity = celebritiesMap[celebrity.Celebrity.Name];
if ((!prevCelebrity || celebrity.Timestamp - prevCelebrity.Timestamp > timestampTolerance) && celebrity.Celebrity.Confidence > confidenceTolerance) {
celebritiesMap[celebrity.Celebrity.Name] = celebrity;
j++;
} else {
celebritiesResult.splice(j, 1);
}
}
When I do the same using a 'for...of' loop:
let celebritiesResult = JSON.parse(celebrityRecognitionJSONFile);
let celebritiesMap = {}
const timestampTolerance = 1000;
const confidenceTolerance = 90;
let count = 0;
for (let celebrity of celebritiesResult) {
let prevCelebrity = celebritiesMap[celebrity.Celebrity.Name];
if ((!prevCelebrity || celebrity.Timestamp - prevCelebrity.Timestamp > timestampTolerance) && celebrity.Celebrity.Confidence > confidenceTolerance) {
celebritiesMap[celebrity.Celebrity.Name] = celebrity;
count++;
} else {
celebritiesResult.splice(count, 1);
}
}
It doesn't work as expected, the 'splice()' function doesn't remove all elements expected to be removed.
I managed to make the 'for...of' loop work, by creating a second object 'celebritiesResult2' as a clone of 'celebritiesResult' and applying the 'splice()' (method on it):
let celebritiesResult = JSON.parse(celebrityRecognitionJSONFile);
let celebritiesResult2 = JSON.parse(celebrityRecognitionJSONFile);//<-
let celebritiesMap = {}
const timestampTolerance = 1000;
const confidenceTolerance = 90;
let count = 0;
for (let celebrity of celebritiesResult) {
let prevCelebrity = celebritiesMap[celebrity.Celebrity.Name];
if ((!prevCelebrity || celebrity.Timestamp - prevCelebrity.Timestamp > timestampTolerance) && celebrity.Celebrity.Confidence > confidenceTolerance) {
celebritiesMap[celebrity.Celebrity.Name] = celebrity;
count++;
} else {
**celebritiesResult2.splice(count, 1);//<-
}
}
The same happens with 'foreach()' too. I have also to create a second object and apply the 'splice()' method on it, so it works as expected.
let celebritiesResult = JSON.parse(celebrityRecognitionJSONFile);
let celebritiesResult2 = JSON.parse(celebrityRecognitionJSONFile);//<-
let celebritiesMap = {};
const timestampTolerance = 1000;
const confidenceTolerance = 90;
celebritiesResult.forEach((item, index) => {
let celebrity = item;
let prevCelebrity = celebritiesMap[celebrity.Celebrity.Name];
if ((!prevCelebrity || celebrity.Timestamp - prevCelebrity.Timestamp > timestampTolerance) && celebrity.Celebrity.Confidence > confidenceTolerance) {
celebritiesMap[celebrity.Celebrity.Name] = celebrity;
} else {
celebritiesResult2.splice(index, 1);//<-
}
});
Why?
EDIT
What I don't understand actually, is why the regular for
loop works and other don't! If we consider what is explained in the link marked as duplicate (Looping through array and removing items, without breaking for loop), the for
loop should be wrong to, and it's not. Why I cannot do the same with a for...of
loop!?!?!?