我有这个:
var mergeUniqueItems = ["-JsDEcxz_ZSGFLKwd1QM",
"-JsJ2NXGDYKI6QRsuXVK",
"-JsJ2RK-kOG2eGcG04xF",
"-JsJ2RK-kOG2eGcG04xF",
"-JsJ2YLPiP6751zh8geS"]
我已经使用这个:
var duplicateArray = [];
for (var i = 0; i < mergeUniqueItems.length; i ++){
for (var j = 1; j < mergeUniqueItems.length; j ++){
if (mergeUniqueItems[i] == mergeUniqueItems[j]){
duplicateArray.push(mergeUniqueItems[i]);
}
}
}
console.log(duplicateArray);
结果又变成是这样的:
["-JsJ2NXGDYKI6QRsuXVK",
"-JsJ2RK-kOG2eGcG04xF",
"-JsJ2RK-kOG2eGcG04xF",
"-JsJ2RK-kOG2eGcG04xF",
"-JsJ2RK-kOG2eGcG04xF",
"-JsJ2YLPiP6751zh8geS"]
当我的期望是在1个阵列像下面重复的项目:
["-JsJ2RK-kOG2eGcG04xF"]
如果有一个以上的重复值,数组应该是这样的:
["-JsJ2RK-kOG2eGcG04xF", "another_duplicate_1", "another_duplicate_2", ...]
我真的不知道什么是错我的代码,请好心帮。
谢谢
启动j
在离i+1
,而不是1
,和检查,以确保你没有已经添加了重复的值。
for (var i = 0; i < mergeUniqueItems.length; i ++){
for (var j = i + 1; j < mergeUniqueItems.length; j ++){
if (mergeUniqueItems[i] == mergeUniqueItems[j]){
if (duplicateArray.indexOf(mergeUniqueItems[i]) < 0)
duplicateArray.push(mergeUniqueItems[i]);
break;
}
这里有一个候补尖尖的正确答案。
var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
return orig.indexOf(item, i+1) === -1;
});
console.log(duplicateArray);
这比使用显式循环清洁好位。
需要注意的是它会保留最后,而不是第一个重复的。 如果这是一个问题,使用.indexOf(item, i-1)
代替。
我可能已经被你需要什么样的困惑。 如果你只需要每个重复的一个实例,那么这将是这样的:
var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
var nxt = orig.indexOf(item, i+1);
return nxt !== -1 && orig.lastIndexOf(item) == nxt;
});
或这个:
var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
var nxt = orig.indexOf(item, i+1);
return nxt !== -1 && orig.indexOf(item, nxt+1) === -1;
});
另一种方法是使用单独的.filter()
在所述第一结果:
var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
return orig.indexOf(item, i+1) !== -1;
}).filter(function(item, i, orig) {
return orig.indexOf(item, i+1) === -1;
});