我知道这可以使用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"
编辑:不应重复,但结果表明存在。
您可能想要使用字典来记住这样的标题
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;
}
});
我看到您的循环仅检查连续的重复项。我看到的唯一问题是您的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)
}
您将需要在外部声明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)
}
您要使用哈希。
var movieHash = {};
for (const movie of movies){
if(movieHash[movie.title])
console.log('duplicate!', movie.title);
else
movieHash[movie.title] = true;
}