JS新设置,删除重复项不区分大小写?

时间:2017-10-14 04:56:08

标签: javascript arrays

var arr = ['verdana', 'Verdana', 2, 4, 2, 8, 7, 3, 6];
result =  Array.from(new Set(arr));

console.log(arr);
console.log(result);

我想删除任何不区分大小写的重复项 所以预期的结果应该是

  

[' Verdana',2,4,8,7,3,6]

但它似乎不起作用......

3 个答案:

答案 0 :(得分:5)

JavaScript比较器区分大小写。对于字符串,您可能需要首先清理数据:

var arr = ['verdana', 'Verdana', 2, 4, 2, 8, 7, 3, 6]
  .map(x => typeof x === 'string' ? x.toLowerCase() : x);
result =  Array.from(new Set(arr));
// produces ["verdana", 2, 4, 8, 7, 3, 6];

或者,您可以将reduce()与自定义嵌套比较逻辑一起使用。 下面的实现比较了忽略大小写的项目,但对于“相等”的字符串,它选择第一次出现,无论它的“大小写”是什么:

'verdana', 'Moma', 'MOMA', 'Verdana', 2, 4, 2, 8, 7, 3, 6]
  .reduce((result, element) => {
    var normalize = function(x) { return typeof x === 'string' ? x.toLowerCase() : x; };

    var normalizedElement = normalize(element);
    if (result.every(otherElement => normalize(otherElement) !== normalizedElement))
      result.push(element);

    return result;
  }, []);
// Produces ["verdana", "Moma", 2, 4, 8, 7, 3, 6]

答案 1 :(得分:1)

将字符串元素转换为Set后,您可以使用uppercase。此处...是展开运算符

var arr = ['verdana', 'Verdana', 2, 4, 2, 8, 7, 3, 6];

var result = arr.map(function(item) {
  return typeof item === "string" ? item.toString().toUpperCase() : item
})

result = [...new Set(result)];

console.log(result);

答案 2 :(得分:1)

var arr = ['verdana', 'Verdana', 2, 4, 2, 8, 7, 3, 6];

function getUniqueValuesWithCase(arr, caseSensitive){
    let temp = [];
    return [...new Set(caseSensitive ? arr : arr.filter(x => {
        let _x = typeof x === 'string' ? x.toLowerCase() : x;
        if(temp.indexOf(_x) === -1){
            temp.push(_x)
            return x;
        }
    }))];
}
getUniqueValuesWithCase(arr, false); // ["verdana", 2, 4, 8, 7, 3, 6]
getUniqueValuesWithCase(arr, true);  // ["verdana", "Verdana", 2, 4, 8, 7, 3, 6]