12

在 JavaScript 数组中如何获取重复字符串的索引?

例子:

MyArray = ["abc","def","abc"]; //----> return 0,2("abc");

另一个例子:

My Array = ["abc","def","abc","xyz","def","abc"] 
//----> return 0,2,5("abc") and 1,4("def");

我不知道该怎么做。在此先感谢您的帮助!

4

3 回答 3

21

01/2022 更新:不再是 2013 年,很多事情都发生了变化。我既不建议修改原型,也不是此答案中的“最佳”方法,因为它需要对数组进行多次迭代。

这是原始答案的更新版本,保留了其精神,以及下面的原始答案。

function getDuplicates<T>(input: T[]): Map<T, number[]> {
    return input.reduce((output, element, idx) => {
        const recordedDuplicates = output.get(element);
        if (recordedDuplicates) {
            output.set(element, [...recordedDuplicates, idx]);
        } else if (input.lastIndexOf(element) !== idx) {
            output.set(element, [idx]);
        }

        return output;
    }, new Map<T, number[]>());
}

还有一种方法:

Array.prototype.getDuplicates = function () {
    var duplicates = {};
    for (var i = 0; i < this.length; i++) {
        if(duplicates.hasOwnProperty(this[i])) {
            duplicates[this[i]].push(i);
        } else if (this.lastIndexOf(this[i]) !== i) {
            duplicates[this[i]] = [i];
        }
    }

    return duplicates;
};

它返回一个对象,其中键是重复条目,值是带有索引的数组,即

["abc","def","abc"].getDuplicates() -> { "abc": [0, 2] }
于 2013-08-24T11:02:12.910 回答
4

另一种不太复杂的方法:

遍历整个数组并跟踪每个元素的索引。为此,我们需要一张string -> positions地图。对象是用于此目的的常用数据类型。键是数组的元素,值是数组中每个元素的索引/位置的数组。

var map = {};

for (var i = 0; i < arr.length; i++) {
    var element = arr[i];  // arr[i] is the element in the array at position i

    // if we haven't seen the element yet, 
    // we have to create a new entry in the map
    if (!map[element]) {
        map[element] = [i];
    }
    else {
       // otherwise append to the existing array
        map[element].push(i);
    }
    // the whole if - else statement can be shortend to
    // (map[element] || (map[element] = [])).push(i)
}

现在您可以遍历映射并删除数组值长度为 1 的所有条目。这些是在数组中只出现一次的元素:

for (var element in map) {
    if (map[element].length === 1) {
        delete map[element];
    }
}

现在map包含string -> positions数组所有重复元素的映射。例如,如果您的数组是["abc","def","abc","xyz","def","abc"],那么map是形式的对象

var map = {
    'abc': [0,2,5],
    'def': [1,4]
};

你可以用任何你喜欢的方式进一步处理它。


进一步阅读:

于 2013-08-24T11:01:02.340 回答
0

这包括有效地查找索引:

var inputArray = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9];
var encounteredIndices = {};

for(var i = 0; i < inputArray.length; i++)
  if (encounteredIndices[inputArray[i]])
    console.log(i); // Or add to some array if you wish
  else
    encounteredIndices[inputArray[i]] = 1;
于 2017-07-05T17:55:34.957 回答