我创建了一个只删除重复字符串的函数,因此只剩下唯一的字符串:
var d = ['a','b','B','C','d','e','f','e'];
d.length; //8
function removeDuplicates(data) {
var i, j, a, b;
for(i = 0; i < data.length - 1; i++) {
a = data[i];
for(j = i; j < data.length; j++) {
b = data[j];
if (a.toLowerCase() == b.toLowerCase()) {
data.splice(j, 1);
}
}
}
}
removeDuplicates(d)
d.length; //4 ????
只有两个重复项,只有 B , e 应该被删除。
但我明白了:
["b", "C", "e", "e"]
答案 0 :(得分:2)
你的问题来自这样一个事实:任何时候我= = j你都会有一个匹配,它将被删除。在你的内循环中,只需进行检查,以便在i!== j
的情况下只执行“删除它们,如果它们相等”此外,正如nnn在评论中指出的那样,拼接会使指数陷入困境。最简洁的方法是使用过滤器和每个。
以下更新的解决方案:
var d = ['a', 'b', 'B', 'C', 'd', 'e', 'f', 'e'];
var e = ['e','e','e','e'];
// d.length; //8
function removeDuplicates(data) {
const noDuplicates = data.filter((letter, ogIndex) => {
return data.every((innerLetter, innerIndex) => {
if (ogIndex < innerIndex) {
const check = letter.toLowerCase() !== innerLetter.toLowerCase();
return check;
} else {
return true;
}
})
})
return noDuplicates
}
console.log(removeDuplicates(d));
// ["a", "B", "C", "d", "f", "e"]
console.log(removeDuplicates(e));
// ["e"]
答案 1 :(得分:1)
使用ES6 / ES2015,获取唯一项目列表的一种简单方法是使用新的Set数据类型。
要“唯一” - 确定数组,只需将其转换为集合然后再转换为数组即可。即。
[...new Set(originalArray)]
(更新:我的答案最初使用Array.from(S_E_T)
将设备转换回数组。我现在已将其更改为[...S_E_T]
以进行转换。)
要以不区分大小写的方式执行相同操作,请遵循相同的逻辑,但只需将每个原始数组元素转换为其小写等效项,然后再将整个数组转换为该集合。
要只保留任何情况下字符串的第一个实例(例如,保持''cAt','CaT'中的'cAt'而不仅仅是全部小写的'cat'),首先执行以下情况 - 如上所述的不敏感搜索,然后从小写的un-uniqified原始数组中获取每个唯一的小写元素的索引,然后使用该索引从原始的un-unqified原始数组中检索任何一个套件元素。
const show = msg => {console.log(JSON.stringify(msg))};
const f = (arr) => {
const arrLC = arr.map(x => x.toLowerCase(x));
return [...new Set(arrLC)].map(x => arr[arrLC.indexOf(x)])
};
const d1 = ['a','b','B','C','d','e','f','e'];
const d2 = ['e', 'e', 'e', 'e', 'e'];
show(d1);
show([...new Set(d1)]);
show([...new Set(d1.map(x => x.toLowerCase(x)))]);
show(f(d1));
show('------');
show(d2);
show([...new Set(d2)]);