在for循环中检查重复项

问题描述 投票:0回答:4

我知道这可以使用for循环来完成,例如for(let i = 0; i < movies.length; i++)但也​​可以在for循环中完成吗?

这是我尝试过的:

const movies = [{title: 'One'}, {title: 'two'}, {title: '1'}]
console.log('---------------------------')
try{
    for (const movie of movies){
        let i = 0
        console.log('i =', i)
        console.log(movie.title, ' = ',movies[i + 1].title)
        // console.log('movies', movies[i + 1].title)

        if(movie.title === movies[i + 1].title){
            console.log('DUPLICATE')
        }
    i = i + 1
    }
} catch (err){
  console.log(err.message)
}

结果:

"i =" 0
"One" " = " "two"
"i =" 0
"two" " = " "two"
"DUPLICATE"
"i =" 0
"1" " = " "two"

编辑:不应重复,但结果表明存在。

javascript
4个回答
0
投票

您可能想要使用字典来记住这样的标题

const movies = [{title: 'One'}, {title: 'two'}, {title: '1'}]
const remember = {
}
movies.forEach((movie, i) => {
  if (remember[movie.title]) {
    console.log("i=" + i + ", Duplicate");
  } else {
    remember[movie.title] = true;
  }
});

0
投票

我看到您的循环仅检查连续的重复项。我看到的唯一问题是您的i变量在for循环内作用域,这使其在算法中无用。在i的值始终为0的日志中,可以轻松验证该问题。这意味着在循环的第二次迭代中,以下行:movie.title === movies[i + 1].title将索引1中的值与其自身进行比较。我要做的是将变量的初始化移到循环外,如下所示:

const movies = [{title: 'One'}, {title: 'two'}, {title: '1'}]
console.log('---------------------------')
try{
    let i = 0
    for (const movie of movies){
        console.log('i =', i)
        console.log(movie.title, ' = ',movies[i + 1].title)
        // console.log('movies', movies[i + 1].title)

        if(movie.title === movies[i + 1].title){
            console.log('DUPLICATE')
        }
        i = i + 1
    }
} catch (err){
  console.log(err.message)
}

0
投票

您将需要在外部声明i并确保i < movies.length

const movies = [{title: 'One'}, {title: 'two'}, {title: '1'}, {title: '1'}]
console.log('---------------------------')

// declare i outside the loop
let i = 0
try{
    for (const movie of movies) {
        console.log('i =', i)
        if(i < movie.length) {
            console.log(movie.title, ' = ', movies[i + 1].title)
        }
       
       
        if(i < movies.length && movie.title === movies[i + 1].title){
            console.log('DUPLICATE')
        }
        
         i = i + 1
       
    }
} catch (err){
  console.log(err.message)
}

但是这不是最好的方法。了解有关time complexity

检查复杂度的最佳方法是使用set。您可以阅读有关set here的更多信息。

设置好后,您可以执行以下操作:

  const movies = [{title: 'One'}, {title: 'two'}, {title: '1'}, {title: '1'}, {title: 'two'}]
    console.log('---------------------------')

    // declare i outside the loop
    let i = 0
    let checkForDups = new Set()
    try{
        for (const movie of movies) {
            if(!checkForDups.has(movie.title)) {
                checkForDups.add(movie.title)
            }
            else {
                console.log("DUPLICATE " + movie.title + " FOUND");
            }
            
        }
    } catch (err){
      console.log(err.message)
    }

0
投票

您要使用哈希。

var movieHash = {};

for (const movie of movies){
  if(movieHash[movie.title])
    console.log('duplicate!', movie.title);
  else
    movieHash[movie.title] = true;
}
© www.soinside.com 2019 - 2024. All rights reserved.