使用Javascript查找1个数组中的常见元素

时间:2015-06-21 16:40:30

标签: javascript arrays

我有这个:

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", ...]

我真的不知道我的代码有什么问题,请帮忙。

由于

2 个答案:

答案 0 :(得分:3)

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;
        }

答案 1 :(得分:3)

这里是Pointy正确答案的替代品。

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;
});