在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");
我不知道怎么做这个。 非常感谢你的帮助!
以下是原始答案的更新版本,保留其精神和原始答案。
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] }
indexOf
和lastIndexOf
,而是首先检查元素是否已经存在于duplicates
中。如果是,则可以直接将索引推送到数组中。这样可以节省一些线性搜索时间,甚至可以完全省略indexOf
(只需与i
进行比较)。否则,使用lastIndexOf
是一个不错的方法! - Felix Kling[object Object]
。它是一个对象,你必须查看它的属性!而且不,你没有说你只想要[0,2]
。这也没有意义,因为你的第二个例子呢?你怎么分离不同条目的重复索引? - Ingo Bürk"[object Object]"
。因此,如果您使用alert
或将其与字符串连接,那就是您得到的结果。然后,您可以进一步处理该对象。您说您只需要[0,2]
,所以只需迭代该对象并获取该值即可!我假设您具有某些JavaScript基础知识。如果没有,我鼓励您阅读教程,例如http://eloquentjavascript.net/。还要查看我的答案中的链接。 - Felix Klingvar 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)
}
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;
0,2,5
和1,4
,除非将它们打包成对象,就像我的答案一样。你只能返回类似于0,1,2,4,5
这样的东西,这样就无法确定它们属于哪个条目或哪个条目包含了多少次。 - Ingo Bürk