Почему срез Array # не работает должным образом, если массив содержит символы вне многоязычной плоскости Basi c? - PullRequest
0 голосов
/ 07 февраля 2020

Этот код работает с «обычными» символами, но не с теми, что находятся за пределами многоязычной плоскости.

. Почему это не работает, и есть ли способ заставить его работать?

let s = "?⛵️?"
let unicodeArray = [...s]

console.log(unicodeArray.slice(1, 2)) // ["⛵"] // correct
console.log(unicodeArray.slice(1, 3)) // ["⛵", "️"] // incorrect

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Проблема в том, что в вашей строке ⛵️ - это две отдельные кодовые точки: эмодзи для парусной шлюпки (U + 26F5) и селектор вариантов (U + FE0F). Ваш unicodeArray имеет длину 4, что приводит к большему количеству подстрок.

Если вы опустите селектор вариантов, он будет работать как выбранный:

const s1 = "abc"
const s2 = "?⛵️?" // length 6
const s3 = "?⛵?" // length 5
console.log(s2 === s3) // false

function substrings(s) {
    const unicodeArray = Array.from(s)
    const result = []

    for (let l = 1; l <= unicodeArray.length; l++) {
      for (let i = 0; i <= unicodeArray.length - l; i++) {
        result.push(unicodeArray.slice(i, i + l).join(''))
      }
    }
    return result
}

console.log(substrings(s1)) // ["a", "b", "c", "ab", "bc", "abc"]
console.log(substrings(s2)) // ["?", "⛵", "️", "?", "?⛵", "⛵️", "️?", "?⛵️", "⛵️?", "?⛵️?"]
console.log(substrings(s3)) // ["?", "⛵", "?", "?⛵", "⛵️?", "?⛵️?"]
0 голосов
/ 07 февраля 2020

Потому что длина этих символов запутывает вашу функцию

console.log("?⛵️?".length); // 6
console.log("abc".length);     // 3
...