在 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");
我不知道该怎么做。在此先感谢您的帮助!
在 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");
我不知道该怎么做。在此先感谢您的帮助!
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] }
另一种不太复杂的方法:
遍历整个数组并跟踪每个元素的索引。为此,我们需要一张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]
};
你可以用任何你喜欢的方式进一步处理它。
进一步阅读:
这包括有效地查找索引:
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;