что является эквивалентом этого кода в JavaScript - PullRequest
3 голосов
/ 23 марта 2019

Я пытаюсь прочитать код, написанный на ruby.Я знаком с JavaScript и хотел бы понять, что код переводит в javascript.

Вот код:

def two_d_translate(arr)
   new_arr = []

   arr.each do |subArray|
    ele = subArray[0]
    num = subArray[1]

    num.times { new_arr << ele }
  end

  return new_arr
end

Целью кода является перевод двумерногомассив в одномерный массив путем печати строки столько раз, сколько число рядом с ней, которое является вторым элементом в каждом подмассиве.

Я использовал это, чтобы попытаться подражать ему, но мне интересно, есть личто-то еще, что может быть лучше.

function two_d_translate(arr) {
  let newArr = '';
  let array = [];

  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j += 2) {
      let ele = arr[i][j];
      let num = arr[i][j+1];

      if (num === 0){
       continue;
      }

      array[i] = Array(num).fill(ele);
    }
  }

  newArr = array.toString().split(',');
  return newArr;
}

Кажется, это круто для этого тестового образца.

arr_1 = [
  ['boot', 3],
  ['camp', 2],
  ['program', 0]
]

console.log(two_d_translate(arr_1));

Это приведет к ожидаемому результату

[ 'boot', 'boot', 'boot', 'camp', 'camp' ]

, но не будет в этом случае

arr_1=[
  ['boot', 3],
  ['camp', 0],
  ['program', 2]
]

это приведет к нежелательному результату, который

[ 'boot', 'boot', 'boot', '', 'program', 'program' ]

Ответы [ 3 ]

3 голосов
/ 23 марта 2019

Сократите ваш массив в один

С помощью Array#reduce вы можете выполнять итерацию по всему массиву, одновременно нажимая / объединяя последние вычисления в конечный результат.Это, в сочетании с Array.fill, позволяет нам создать правильное количество, иногда 0, строки.А с Array#concat мы можем легко перевести этот 3D-массив в 2D-массив.Вот пример:

function translateTo2D(arr) {
  return arr.reduce((result, [name, count]) =>
    result.concat(Array(count).fill(name)),
  []);
}

const arr = [['a', 2], ['b', 0], ['c', 1]];
console.log(translateTo2D(arr));
2 голосов
/ 23 марта 2019

Хитрость заключается в использовании flatMap для объединения отдельных прогонов:

let translate = a => a.flatMap(([s, n]) => Array(n).fill(s))

console.log(translate([
    ['boot', 3],
    ['camp', 2],
    ['program', 1]
]))

Если ваша цель еще не поддерживает flatMap, эквивалентная идиома ES6 будет [].concat(...map):

let translate = a => [].concat(...a.map(([s, n]) => Array(n).fill(s)))

console.log(translate([
    ['boot', 3],
    ['camp', 2],
    ['program', 1]
]))

Как правило, вы используете map/flatMap при преобразовании «многих вещей» во «много вещей» и reduce для «многих вещей» в «одно»вещь».

2 голосов
/ 23 марта 2019

Если ваша среда позволяет распространять синтаксис, вы можете сделать что-то вроде этого

const arr_1 = [
  ['boot', 3],
  ['camp', 0],
  ['program', 2]
]

const result = arr_1.reduce((acc, [string, times]) => [...acc, ...Array(times).fill(string)], []);
console.log(result); // [ 'boot', 'boot', 'boot', 'program', 'program' ]
...