Как из массива получить значения и разбить их на буквы?

418
15 сентября 2017, 23:07

Есть какой-то элегантный способ разбить значение на буквы, за тем перейти к следующему значению? У меня что-то одни костыли да ошибки получаются.

var key = 0;
var array = [
    [
        'один',
        'два',
        'три'
    ],
    [
        'first',
        'second',
        'third'
    ]
];
array[key]

Пример без разбивания на буквы:

for(var value = 0; value < array[key].length; value++) {
    console.log(array[key][value]);
}

Результат:

один
два
три

Желаемый результат:

о
д
и
н
д
в
а
т
р
и
Answer 1

var key = 0; 
var array = [ 
    [ 
        'значение', 
        'значение', 
        'значение' 
    ], 
    [ 
        'значение', 
        'значение', 
        'значение', 
        'значение', 
        'значение' 
    ] 
]; 
 
for(let i = 0; i < array.length; i++) { 
  for(let j = 0; j < array[i].length; j++) { 
    for(let k = 0; k < array[i][j].length; k++) { 
      document.write(array[i][j][k]); 
    } 
  } 
}

Answer 2

Элементы массива можно перебрать с помощью метода forEach. Он вызовет функцию callback для каждого элемента массива:

arr.forEach(function callback(currentValue, index, array) {
    //your iterator
}[, thisArg]);

Этот метод применяется именно к массивам. Чтобы пройти по символам из строки, можно сначала воспользоваться методом split. Он разобьёт строку на фрагменты и вернёт массив из этих фрагментов:

var arr = str.split([separator][, limit]);

Получится, например, так:

var array = [ 
    [ 
        'один', 
        'два', 
        'три' 
    ], 
    [ 
        'первый', 
        'второй', 
        'третий' 
    ], 
    [ 
        'first', 
        'second', 
        'third' 
    ] 
]; 
 
array.forEach( function(word) { 
  word[0].split('').forEach( function(letter) { 
    console.log( letter ); 
  }); 
});

Но массивы с числовыми индексами быстрее всего перебираются циклом for (var i=0; i<arr.length; i++), потому что браузер их "особым образом оптимизирует". Поэтому быстрее всего отработает код, предложенный @MedvedevDev.

Answer 3

Если в вопросе было не о скорости, то можно вот так вот:

function f(arr) {
  return arr.reduce((s, a) => {
   return s.concat(typeof a === 'string' ? a.length === 1 ? a : f(Array.from(a)) : f(a));
  }, []);
}

такой вызов

console.log(f([
    [
        'значение',
        'значение',
        'значение'
    ],
    [
        'значение',
        'значение',
        'значение',
        'значение',
        'значение'
    ]
]));

вернет

[ 'з',
  'н',
  'а',
  'ч',
  'е',
  'н',
  'и',
  'е',
  'з',
  'н',
  'а',
  'ч',
  'е',
  ...
Answer 4

Eщё один вариант:

array.forEach( function(word) {
for( let k in word ) {
    word[k].split('').forEach( function(letter) {
        console.log( letter );
    });
  }
});
Answer 5
for( var k in array ) {
    for (var i in array[k] ) {
        for ( var j in array[k][i]) {
            console.log( array[k][i][j] )
        }
    }
}
READ ALSO
Как в javascript &ldquo;закрывать&rdquo; div при клике вне этого дива?

Как в javascript “закрывать” div при клике вне этого дива?

При клике по некоторому элементу управления на экране появляется div c текстом подсказокУ дива есть кнопка "закрыть"

278
Выбор области изображения по точкам

Выбор области изображения по точкам

Интересует возможность реализации выделения области изображения по нескольким точкам, которые пользователь мышью будет ставитьАналог...

223
how to hide stackLabels for non column series type in Highchart js?

how to hide stackLabels for non column series type in Highchart js?

how to hide stackLabel for spline in this example Как скрыть вывод суммы для сплайна?

285
Сброс таймера js

Сброс таймера js

Каким образом можно сбрасывать таймер? при нажатие закрыть уведомление (Close или Message)

282