为什么这个removeDuplicate不起作用?

时间:2017-02-10 01:44:51

标签: javascript algorithm

我创建了一个只删除重复字符串的函数,因此只剩下唯一的字符串:

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"]

2 个答案:

答案 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)]);