Javascript JS新建集,删除重复项不区分大小写?

Javascript JS新建集,删除重复项不区分大小写?,javascript,arrays,Javascript,Arrays,我想删除所有不区分大小写的重复项 因此,预期的结果应该是 [Verdana',2,4,8,7,3,6] 但它似乎不起作用…JavaScript comparator是区分大小写的。对于字符串,您可能需要首先清理数据: 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]


但它似乎不起作用…

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

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

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

或者,您可以使用带有自定义嵌套比较逻辑的
reduce()
。下面的实现会比较忽略大小写的项,但对于“相等”字符串,它会选择第一个匹配项,而不管其“大小写”是什么:


在将字符串元素转换为
大写
后,可以使用
设置
。此处
是扩展运算符

var arr=['verdana','verdana',2,4,2,8,7,3,6];
var结果=arr.map(功能(项目){
返回项的类型==“字符串”?项。toString().toUpperCase():项
})
结果=[…新集合(结果)];

控制台日志(结果)定义
似乎不起作用
请,因为它对我起作用。它不会删除Verdana,但如果。。。我想我有一个像“MoMa”这样的条目……我不想把它改成小写?@Francesco,这要复杂得多。我会使用不同的东西,而不是
Set
。我需要考虑一下。理想情况下,
Set
应该接收一个
equality
函数,但是我用MDN仔细检查了一下——没有看到任何东西可以让我们调整
Set
的行为。@Francesco另外,如果你的数组是
['MoMa','MoMa','MoMa','MoMa']
,你怎么能猜出列表中还有什么,什么会消失?@Francesco看到我的更新答案,以及“MoMa”情况的示例代码。希望有帮助。是的,我同意要求太多了,除非有一个预定义的规则来保留“MoMa”而不是其他情况…+1
。toString()
是冗余的,如果知道
typeof item=='string'
。不过,Spread运算符是好的!似乎与要求的输出不匹配(Verdana和not Verdana)
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];
'verdana', 'Moma', 'MOMA', 'Verdana', 2, 4, 2, 8, 7, 3, 6]
  .reduce((result, element) => {
    var normalize = x => 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]
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]