Javascript JS新建集,删除重复项不区分大小写?
我想删除所有不区分大小写的重复项 因此,预期的结果应该是 [Verdana',2,4,8,7,3,6]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); 或者,您可以使用
但它似乎不起作用…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]