Tengo una matriz que contiene muchos sistemas de escritura:
var SCRIPTS = [ { name: "Adlam", ranges: [[125184, 125259], [125264, 125274], [125278, 125280]], direction: "rtl", year: 1987, living: true, link: "https://en.wikipedia.org/wiki/Fula_alphabets#Adlam_alphabet" }, { name: "Han", ranges: [[11904, 11930], [11931, 12020], [12032, 12246], [12293, 12294], [12295, 12296], [12321, 12330], [12344, 12348], [13312, 19894], [19968, 40939], [63744, 64110], [64112, 64218], [131072, 173783], [173824, 177973], [177984, 178206], [178208, 183970], [183984, 191457], [194560, 195102]], direction: "ltr", year: -1100, living: true, link: "https://en.wikipedia.org/wiki/Chinese_characters" }, // and many more entries }Mi tarea es averiguar a qué sistema de escritura pertenece un personaje:
scriptOfSample("英", SCRIPTS) // hanAquí está mi primer enfoque, que es una solución funcional.
function scriptOfSample(a, scripts) { const codePoint = a.codePointAt(0) for (let language of scripts) { let isInRange = language.ranges.find(([from, to]) => from <= codePoint && codePoint <= to) if (isInRange) { return language.name } } return undefined } Por curiosidad, he intentado usar un enfoque con el método .forEach() .
function scriptOfSample(a, scripts) { const codePoint = a.codePointAt(0) scripts.forEach(({ranges, name}) => { let isInRange = ranges.find(([from, to]) => from <= codePoint && codePoint <= to) if (Array.isArray(isInRange)) { console.log("found one") return name } }) return undefined } Sin embargo, en este caso isInRange no es un valor booleano sino que contiene el rango [from, to] en el que el predicado era verdadero.
Lo que me gustaria saber:
find() devuelve valores diferentes?Los comentarios son correctos al decir que Array#find devuelve un elemento de la matriz o undefined . Como lo está llamando en ranges que es una matriz de matrices, obtiene una matriz de vuelta.
En su lugar, puede usar el método Array#some , que devuelve un boolean si se cumple la condición en cualquier elemento de la matriz:
function scriptOfSample(a, scripts) { const codePoint = sample.codePointAt(0); if (codePoint == null) return undefined const system = scripts.find( (script) => script.ranges.some( ([from, to]) => from <= codePoint && codePoint <= to ) ); return system ? system.name : undefined }