JavaScript

Помогите избавиться от пустых значений в массиве.

У меня есть 2 функции, первая Range генерирует массив в заданном диапазоне, вторая UnicodeParse на основе переданного массива преобразует в соответствии с таблицей Unicode.

Проблема в функции UnicodeParse, когда я передаю числовой массив и на основе него сопоставляю с таблицей Unicode, то по мимо результата получаю empty × 72(пустые строки). Похоже, что fromCharCode() ловит дубли и записывает их в массив в виде пустого значения.

Здесь мой код, запустите проект ещё раз, предварительно открыв консоль для большей наглядности, обратите внимание на 3 строку в консоли:

https://jsfiddle.net/71roqf3u/

Отфильтровать массив не получается, так как я теряю ключи. Как избавиться от пустых значений в массиве, сохранив существующие?
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 итераций это не существенно.
Igor Fendrik
Igor Fendrik
62 360
Лучший ответ
Роман Олифиренко Я понимаю ваше стремление написать тоже самое с нуля. Но вы изначально допустили следующие ошибки:

1) Ваш вариант не допускает той возможности, что кол-во charCode(ов) вообще должно совпадать с кол-вом символов в массиве. Я прикрепил изображение которое это демонстрирует.

2) Ко всему прочему, мне необходим ассоциативный массив, типа - ключ: значение.
У меня таковые уже есть и даже работают (в числовом варианте присутствуют неопределённые элементы, которых быть не должно).
Роман Олифиренко "filter( e => en ? /[a-z]/i.test(e) : ru ? /[а-яё]/i.test(e) : true )"

Я предполагаю контролировать ввод на 3 языках, с наличием возможности того, что язык ввода будет не определён (а не только на двух).

"P.s. не понял, для чего вообще нужны 'cod' и 'arr'.."

Они выступают в роли якоря, для нужного значения (конкретно), 'cod' и 'arr' - это 2 разных массива.
подключи lodash и используй lodash.com/docs/4.17.15#compact
или сделай spread массива с empty слотами и фильтруй
AA
Anthony Anthony
5 745
Роман Олифиренко "подключи lodash и используй.."

Не вышло, ключи затёрлись - это то, о чём я и говорил.

"или сделай spread массива с empty слотами.."

А можно на примере, вообще не представляю как это сделать.
Anthony Anthony jsfiddle.net/muhurov/brms3o7L/
console.log(UnicodeParse(Range(72, 79), 'arr').filter(Boolean));

=)
А*
Антон *******
3 760
Роман Олифиренко Это тоже самое, что у меня в строке под номером 2. Откройте каждый массив, увидите разницу.