Find common elements in 1 array using Javascript

Refresh

December 2018

Views

350 time

1

I have this:

var mergeUniqueItems = ["-JsDEcxz_ZSGFLKwd1QM", 
"-JsJ2NXGDYKI6QRsuXVK", 
"-JsJ2RK-kOG2eGcG04xF", 
"-JsJ2RK-kOG2eGcG04xF", 
"-JsJ2YLPiP6751zh8geS"]

I have used this:

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

Result has turn to be like this:

["-JsJ2NXGDYKI6QRsuXVK", 
"-JsJ2RK-kOG2eGcG04xF", 
"-JsJ2RK-kOG2eGcG04xF", 
"-JsJ2RK-kOG2eGcG04xF", 
"-JsJ2RK-kOG2eGcG04xF", 
"-JsJ2YLPiP6751zh8geS"]

When my expectation is duplicate items in 1 array like below:

 ["-JsJ2RK-kOG2eGcG04xF"]

If there are more than one duplicate value, array should be like this:

["-JsJ2RK-kOG2eGcG04xF", "another_duplicate_1", "another_duplicate_2", ...]

I don't really know what's wrong with my code, please kindly help.

Thanks

2 answers

3

Вот заместитель правильного ответа заостренный в.

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