使用扩展语法从包含表情符号的字符串中过滤空字符串
Posted
技术标签:
【中文标题】使用扩展语法从包含表情符号的字符串中过滤空字符串【英文标题】:Filtering empty strings from a string containing emojis using spread syntax 【发布时间】:2017-12-12 06:03:54 【问题描述】:我正在努力保持时尚,所以我一直在玩spread operator 和表情符号。我注意到,当我想将filter
空字符串(''
)从生成的“扩展”数组中取出时,空字符串不会被删除。这是为什么呢?
console.log([...'????︎']); // ['????︎', '']
console.log([...'????︎'].filter(String)); // ['????︎', '']
console.log(['????︎', ''].filter(String)); // ['????︎']
【问题讨论】:
警报('' == 0);他们算作 0 【参考方案1】:您的字符串中有一个不可见的字符,即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);
【讨论】:
正打算发布相同的内容。 “空白字符”返回的字符代码实际上是65038
,我看到它被标识为Unicode Character 'VARIATION SELECTOR-15' (U+FE0E)。
糟糕,我讨厌表情符号。所以我可能需要这样做:[...'?︎'].filter(function(n) return n && n.charCodeAt(0) != 65038; )
取决于你想做什么?你想把表情符号翻译成什么东西吗?
好吧,我只是在搞砸这个,但实际上我想删除“空”字符串。所以我想我可以通过空字符串和任何 charcode 65038 进行过滤。
你可以(粗略地)计算字符串 s
和 console.log(s.split('').length - [...s].length);
中的表情符号以上是关于使用扩展语法从包含表情符号的字符串中过滤空字符串的主要内容,如果未能解决你的问题,请参考以下文章