У меня есть 2 функции, первая Range генерирует массив в заданном диапазоне, вторая UnicodeParse на основе переданного массива преобразует в соответствии с таблицей Unicode.
Проблема в функции UnicodeParse, когда я передаю числовой массив и на основе него сопоставляю с таблицей Unicode, то по мимо результата получаю empty × 72(пустые строки). Похоже, что fromCharCode() ловит дубли и записывает их в массив в виде пустого значения.
Здесь мой код, запустите проект ещё раз, предварительно открыв консоль для большей наглядности, обратите внимание на 3 строку в консоли:
https://jsfiddle.net/71roqf3u/
Отфильтровать массив не получается, так как я теряю ключи. Как избавиться от пустых значений в массиве, сохранив существующие?
JavaScript
Помогите избавиться от пустых значений в массиве.
var a = arr[i];
//...
result[ a ] = ...
Ошибка здесь. В result надо последовательно пихать все значения, а они добавляются в индекс под номером charCode-a
Были бы там китайские иероглифы, был бы массив с 80,000+ пустыми)
____________________
console.log("%c Range(72, 79)", "color: orange", Range(72, 79));
console.log( UnicodeParse( Range(72, 79) ) );
console.log("%c Range('A', 'z')", "color: orange", Range('A', 'z'));
console.log( UnicodeParse( Range('A', 'z') ) );
console.log("%c Range('Ё', 'ё')", "color: orange", Range('Ё', 'ё'));
console.log( UnicodeParse( Range('Ё', 'ё') ) );
function Range(start, end) {
if( isNaN(start) || isNaN(end) ){
start = ("" + start).charCodeAt();
end = ("" + end).charCodeAt(); // потому что число. charCodeAt() — ошибка.
}
return new Array(end - start+1).fill(0).map( (d,i) => start + i )
}
function UnicodeParse(arr){
let en = /[a-z]/i.test( String.fromCharCode(arr[0]) );
let ru = /[а-яё]/i.test( String.fromCharCode(arr[0]) );
return (
arr.map( code => String.fromCharCode(code) )
.filter( e => en ? /[a-z]/i.test(e) : ru ? /[а-яё]/i.test(e) : true )
);
}
____
P.s. не понял, для чего вообще нужны 'cod' и 'arr' — из range сразу же даются коды...
P.s.-2 конечно короткий код за счет лишних операций, но в рамках 100,000 итераций это не существенно.
//...
result[ a ] = ...
Ошибка здесь. В result надо последовательно пихать все значения, а они добавляются в индекс под номером charCode-a
Были бы там китайские иероглифы, был бы массив с 80,000+ пустыми)
____________________
console.log("%c Range(72, 79)", "color: orange", Range(72, 79));
console.log( UnicodeParse( Range(72, 79) ) );
console.log("%c Range('A', 'z')", "color: orange", Range('A', 'z'));
console.log( UnicodeParse( Range('A', 'z') ) );
console.log("%c Range('Ё', 'ё')", "color: orange", Range('Ё', 'ё'));
console.log( UnicodeParse( Range('Ё', 'ё') ) );
function Range(start, end) {
if( isNaN(start) || isNaN(end) ){
start = ("" + start).charCodeAt();
end = ("" + end).charCodeAt(); // потому что число. charCodeAt() — ошибка.
}
return new Array(end - start+1).fill(0).map( (d,i) => start + i )
}
function UnicodeParse(arr){
let en = /[a-z]/i.test( String.fromCharCode(arr[0]) );
let ru = /[а-яё]/i.test( String.fromCharCode(arr[0]) );
return (
arr.map( code => String.fromCharCode(code) )
.filter( e => en ? /[a-z]/i.test(e) : ru ? /[а-яё]/i.test(e) : true )
);
}
____
P.s. не понял, для чего вообще нужны 'cod' и 'arr' — из range сразу же даются коды...
P.s.-2 конечно короткий код за счет лишних операций, но в рамках 100,000 итераций это не существенно.
подключи lodash и используй lodash.com/docs/4.17.15#compact
или сделай spread массива с empty слотами и фильтруй
или сделай spread массива с empty слотами и фильтруй
Роман Олифиренко
"подключи lodash и используй.."
Не вышло, ключи затёрлись - это то, о чём я и говорил.
"или сделай spread массива с empty слотами.."
А можно на примере, вообще не представляю как это сделать.
Не вышло, ключи затёрлись - это то, о чём я и говорил.
"или сделай spread массива с empty слотами.."
А можно на примере, вообще не представляю как это сделать.
Anthony Anthony
jsfiddle.net/muhurov/brms3o7L/
console.log(UnicodeParse(Range(72, 79), 'arr').filter(Boolean));
=)
=)
Роман Олифиренко
Это тоже самое, что у меня в строке под номером 2. Откройте каждый массив, увидите разницу.
Похожие вопросы
- Как найти максимальное значение в массиве массивов?
- Получение массива из объектов, которые содержат имя cookie и ее значение
- Как правильно найти наибольший и наименьший значения массива?
- Программирование Джава. Написать код на упорядочивание массивов.
- Как только с конца массива обрезать все пустые элементы? var arr = [0,,2,,,];
- вопрос про массивы
- Нужна помощь в массиве JavaScript
- Сравнение двухмерного массива
- Массивы с длиной-что это
- напишите программу которая проверяет элементы массива на схожесть
1) Ваш вариант не допускает той возможности, что кол-во charCode(ов) вообще должно совпадать с кол-вом символов в массиве. Я прикрепил изображение которое это демонстрирует.
2) Ко всему прочему, мне необходим ассоциативный массив, типа - ключ: значение.
У меня таковые уже есть и даже работают (в числовом варианте присутствуют неопределённые элементы, которых быть не должно).
Я предполагаю контролировать ввод на 3 языках, с наличием возможности того, что язык ввода будет не определён (а не только на двух).
"P.s. не понял, для чего вообще нужны 'cod' и 'arr'.."
Они выступают в роли якоря, для нужного значения (конкретно), 'cod' и 'arr' - это 2 разных массива.