【问题标题】:what is the equivalent of this code in javascriptjavascript中这段代码的等价物是什么
【发布时间】:2019-08-14 01:17:03
【问题描述】:

我正在尝试阅读一些用 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' ]

【问题讨论】:

    标签: javascript ruby translate


    【解决方案1】:

    将你的数组缩减为一个

    使用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】:

      如果你的环境允许传播语法,你可以这样做

      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' ]
      

      【讨论】:

        【解决方案3】:

        诀窍是使用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

        【讨论】:

        • @ChrisBrownie55:“ES6”指的是“...concat”的东西。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多