javascript唯一字符串数组不区分大小写但保留一个区分大小写的结果

问题描述 投票:-2回答:1

这是什么意思?首先让我们看看我写的一些代码:

  let names = ['James', 'james', 'bob', 'JaMeS', 'Bob'];
  let uNames = {};

  names.forEach(n => {
    let lower = n.toLowerCase();
    if (!uNames[lower]) {
      uNames[lower] = n;
    }
  });

  names = Object.values(uNames);
  console.log(names); // >>> (2) ["James", "bob"]

这里的目标是使给定的数组不区分大小写唯一,但保留一个原始输入。

我想知道这个问题是否比我想出的更优雅/更好的解决方案。

在将整个数组变为唯一之前将其转换为小写不是一种解决方案,因为我希望最终结果只包含已经在输入数组中的值。哪一个(例如JamesjamesJaMeS)无关紧要。

javascript arrays performance unique case-insensitive
1个回答
3
投票

我想知道这个问题是否比我想出的更优雅/更好的解决方案。

使用Map

let names = ['James', 'james', 'bob', 'JaMeS', 'Bob'];
let uNames = new Map(names.map(s => [s.toLowerCase(), s]));

console.log([...uNames.values()]); 

Map的构造函数可以采用一对数组(嵌套数组有2个值:键和值)。 Map将保留一个唯一的键列表,因此在构造之前,如果键是相同的,则存储的值将被覆盖。

获得Map后,您可以使用.values()迭代值。

With plain object

您还可以使用Object.fromEntries方法,该方法在撰写本文时是在Chrome,Firefox,Opera和Safari中实施的第4阶段提案(Draft ES2020):

let names = ['James', 'james', 'bob', 'JaMeS', 'Bob'];
let uNames = Object.fromEntries(names.map(s => [s.toLowerCase(), s]));

console.log(Object.values(uNames)); 

如您所见,该方法非常相似。

© www.soinside.com 2019 - 2024. All rights reserved.