使用Javascript在1数组中查找公共元素

使用Javascript在1数组中查找公共元素,javascript,arrays,Javascript,Arrays,我有这个: var mergeUniqueItems = ["-JsDEcxz_ZSGFLKwd1QM", "-JsJ2NXGDYKI6QRsuXVK", "-JsJ2RK-kOG2eGcG04xF", "-JsJ2RK-kOG2eGcG04xF", "-JsJ2YLPiP6751zh8geS"] 我用过这个: var duplicateArray = []; for (var i = 0; i < mergeUniqueItems.length; i ++){

我有这个:

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);
当我的期望值为1个数组中的重复项时,如下所示:

 ["-JsJ2RK-kOG2eGcG04xF"]
如果存在多个重复值,则数组应如下所示:

["-JsJ2RK-kOG2eGcG04xF", "another_duplicate_1", "another_duplicate_2", ...]
var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
    var nxt = orig.indexOf(item, i+1);
    return nxt !== -1 && orig.lastIndexOf(item) == nxt;
});
我真的不知道我的代码出了什么问题,请帮忙


感谢在
i+1
处启动
j
而不是
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;
        }
for(var i=0;i
i+1
处启动
j
而不是在
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;
        }
for(var i=0;i
这里有一个代替波蒂正确答案的选项

var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
    return orig.indexOf(item, i+1) === -1;
});

console.log(duplicateArray);
它比使用显式循环更简洁

请注意,它将保留最后一个而不是第一个副本。如果这是一个问题,请使用
.indexOf(item,i-1)


我可能被你需要的东西弄糊涂了。如果你只需要每个副本的一个实例,那么它会是这样的:

["-JsJ2RK-kOG2eGcG04xF", "another_duplicate_1", "another_duplicate_2", ...]
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;
});

这是波蒂正确答案的另一种选择

var duplicateArray = mergeUniqueItems.filter(function(item, i, orig) {
    return orig.indexOf(item, i+1) === -1;
});

console.log(duplicateArray);
它比使用显式循环更简洁

请注意,它将保留最后一个而不是第一个副本。如果这是一个问题,请使用
.indexOf(item,i-1)


我可能被你需要的东西弄糊涂了。如果你只需要每个副本的一个实例,那么它会是这样的:

["-JsJ2RK-kOG2eGcG04xF", "another_duplicate_1", "another_duplicate_2", ...]
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;
});

为什么我不能在10分钟内接受答案?先生,你的答案是正确的。谢谢。@Vicheanak:因为有时候看似正确的答案可能是错误的、误导性的,甚至是危险的。一个小小的时间限制可以让更多的人看到答案,并在必要时做出反应。为什么我不能在10分钟内接受答案?哟您的答案是正确的,先生。谢谢。@Vicheanak:因为有时看似正确的答案可能是错误的、误导性的,甚至是危险的。一个小的时间限制允许更多的人查看答案,并在必要时作出反应。您的描述有点混乱。结果是否应该保留或排除重复项。您的代码看起来是这样的我不完全理解您显示的结果。您的描述有点混乱。结果是否应该保留或排除重复项。您的代码看起来应该保留重复项(上次重复项除外),我不完全理解您显示的结果。