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

时间:2018-02-11 12:18:36

标签: javascript arrays performance unique case-insensitive

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

  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)不相关。

2 个答案:

答案 0 :(得分:3)

  

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

使用Map



-O2




let names = ['James', 'james', 'bob', 'JaMeS', 'Bob']; let uNames = new Map(names.map(s => [s.toLowerCase(), s])); console.log([...uNames.values()]); 的构造函数可以采用一对数组(具有2个值的嵌套数组:键和值)。 Map将保留一个唯一的键列表,因此在构造之前,如果键是相同的,则存储的值将被覆盖。

获得地图后,您可以使用Map迭代值。

使用普通对象

您还可以使用.values()方法,该方法在撰写本文时是Chrome和Chrome中实施的第4阶段提案。火狐:



Object.fromEntries




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

答案 1 :(得分:0)

如果要对字符串数组进行重复数据删除,并且优先考虑首次出现的情况,并保持插入顺序,请使用此方法。

const a = ["ALPHA", "10", "BETA", "10", "alpha", "beta", "aLphA"];
const b = ["3", "1", "2", "2", "3", "1"];

function dedupe(string_array) {
	const entries = string_array
		.slice()
		.reverse()
		.map((string, index) => [
			string.toLowerCase(),
			{
				string,
				index: string_array.length - 1 - index
			}
		]);
	const case_insensitively_deduped_string_array = Array
		.from((new Map(entries)).values())
		.sort((a, b) => (a.index - b.index))
		.map(item => item.string);
	return case_insensitively_deduped_string_array;
	// Takes the first occurrences, keeping the insertion order.
	// Doesn’t modify the input array.
}

console.log(a, dedupe(a));
console.log(b, dedupe(b));