使用扩展语法从包含表情符号的字符串中过滤空字符串
Filtering empty strings from a string containing emojis using spread syntax
我想保持时尚,所以我一直在玩 spread operator and emojis. I noticed that when I want to filter
空字符串 (''
) 结果 "spread-ed" 数组,空字符串不是被删除。这是为什么?
console.log([...'︎']); // ['︎', '']
console.log([...'︎'].filter(String)); // ['︎', '']
console.log(['︎', ''].filter(String)); // ['︎']
你的字符串中有一个不可见的字符,是一个variation selector。如果您打印字符代码,您可以看到这一点:
console.log([...'︎'].map(s => s.charCodeAt(0)));
如果您的目标是删除那个特定的 variation selector 15,那么您可以只使用 replace
:
s.replace(/\ufe0e/g, '')
请注意表情符号在您的第三条语句的输出中略有不同。这是变体选择器的效果,您从前两个语句中的第一个字符中删除了它。虽然那个特殊字符本身不打印任何东西,并且在隔离时显示为空字符串,但它确实不是空的,所以 filter
不会排除它。
表情符号字符本身位于单个单词 UTF-16 范围之外,因此它们占用两个单词。
当您用 split
拆分这样的单字符字符串时,您会得到两个单独的字符(JavaScript 的历史奇特),它们代表 UTF 编码。如果您的目标是计算字符串中的表情符号(和其他高范围字符),您可以使用此代码:
console.log(s.split('').length - [...s].length);
我想保持时尚,所以我一直在玩 spread operator and emojis. I noticed that when I want to filter
空字符串 (''
) 结果 "spread-ed" 数组,空字符串不是被删除。这是为什么?
console.log([...'︎']); // ['︎', '']
console.log([...'︎'].filter(String)); // ['︎', '']
console.log(['︎', ''].filter(String)); // ['︎']
你的字符串中有一个不可见的字符,是一个variation selector。如果您打印字符代码,您可以看到这一点:
console.log([...'︎'].map(s => s.charCodeAt(0)));
如果您的目标是删除那个特定的 variation selector 15,那么您可以只使用 replace
:
s.replace(/\ufe0e/g, '')
请注意表情符号在您的第三条语句的输出中略有不同。这是变体选择器的效果,您从前两个语句中的第一个字符中删除了它。虽然那个特殊字符本身不打印任何东西,并且在隔离时显示为空字符串,但它确实不是空的,所以 filter
不会排除它。
表情符号字符本身位于单个单词 UTF-16 范围之外,因此它们占用两个单词。
当您用 split
拆分这样的单字符字符串时,您会得到两个单独的字符(JavaScript 的历史奇特),它们代表 UTF 编码。如果您的目标是计算字符串中的表情符号(和其他高范围字符),您可以使用此代码:
console.log(s.split('').length - [...s].length);