Typescript 如何在';对于';环

Typescript 如何在';对于';环,typescript,for-loop,splice,Typescript,For Loop,Splice,我想将splice()与“for…of”循环一起使用 以下是我想要做的,但使用常规的“for”循环: let celebritiesResult = JSON.parse(celebrityRecognitionJSONFile); let celebritiesMap = {} const timestampTolerance = 1000; const confidenceTolerance = 90; for (let j = 0; j < celebritiesResult.len

我想将splice()与“for…of”循环一起使用

以下是我想要做的,但使用常规的“for”循环:

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);
    }
}
它不能按预期工作,“splice()”函数不能删除所有预期要删除的元素

我通过创建第二个对象“CeleritiesResult2”作为“CeleritiesResult”的克隆并应用“splice()”(方法),成功地实现了“for…”of循环:

让CelleritiesResult=JSON.parse(CellerityRecognitionJSonfile);
让CelleritiesResult2=JSON.parse(CellerityRecognitionJSonfile);//时间戳(容忍度)和&名人.名人.自信>自信容忍度){
celebritiesMap[名人.名人.姓名]=名人;
计数++;
}否则{
**celebritiesResult2.拼接(计数,1);//timestames容差)和&名人.名人.Confidence>Confidence容差){
celebritiesMap[名人.名人.姓名]=名人;
}否则{

celebritiesResult2.splice(index,1);//您的示例中没有一个能够正确工作,包括
for in
循环,因为您在迭代时修改了数组中的项数。查看简化
的结果以了解in
示例:

let array=[0,1,2,3,4,5,6,7,8,9]
for(设j=0;jconsole.log(数组)
为什么要使用
for..of
?如果它与索引for循环一起工作,请使用索引for循环。基本上,你是在改变你正在迭代的数组,这恰恰导致了这些问题。@HereticMonkey,我更喜欢
for…of
语法。我只是想了解一下,在进一步的开发中避免类似的问题注意。常规的
for
循环是由另一个人创建的,我觉得它不准确,所以我想用我自己的方式做同样的事情来验证它。在第三个和第四个示例中,我没有修改循环使用的相同数组。你确定它们没有按预期工作吗?这些与答案几乎相同在建议的副本…@118218中,我理解您暗示您的
for in
循环有效,但
for of
无效,而这两个副本均无效。副本示例(第三个和第四个)可能有用,但你不需要所有额外的逻辑,那时你就可以过滤了。@HereticMonkey我现在已经看过了提议的副本。有一个答案在第五位是
filter
。我认为这个答案更适合这里的问题。它也更一般(没有
拍卖。拍卖。过滤…
)可运行,结果清晰。
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);
    }
}
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);//<-
    }
}
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);//<-
    }
});