首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下代码在javascript中的等价物是什么

以下代码在javascript中的等价物是什么
EN

Stack Overflow用户
提问于 2019-03-23 10:21:57
回答 3查看 117关注 0票数 3

我正在试着读一些用ruby写的代码。我精通javascript,想要了解代码在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

这段代码的目的是将一个二维数组转换为一个一维数组,方法是打印字符串的次数与它旁边的数字一样多,这是每个子数组中的第二个元素。

我用它来模仿它,但我想知道是否有其他东西可以更好。

代码语言:javascript
复制
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;
}

对于这个测试样本来说,这似乎很酷。

代码语言:javascript
复制
arr_1 = [
  ['boot', 3],
  ['camp', 2],
  ['program', 0]
]

console.log(two_d_translate(arr_1));

它将产生预期的输出

代码语言:javascript
复制
[ 'boot', 'boot', 'boot', 'camp', 'camp' ]

但在这种情况下不会

代码语言:javascript
复制
arr_1=[
  ['boot', 3],
  ['camp', 0],
  ['program', 2]
]

这将导致不期望的输出,即

代码语言:javascript
复制
[ 'boot', 'boot', 'boot', '', 'program', 'program' ]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-23 10:47:50

将您的阵列缩减为单个阵列

使用Array#reduce,您可以遍历整个数组,同时将最后一次计算推入/连接到最终结果。这与Array.fill相结合,允许我们创建正确的字符串数量,有时是0。使用Array#concat,我们可以很容易地将这个3D数组转换为2D数组。下面是一个示例:

代码语言:javascript
复制
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));

票数 3
EN

Stack Overflow用户

发布于 2019-03-23 10:36:29

如果您的环境允许扩展语法,则可以执行以下操作

代码语言:javascript
复制
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' ]
票数 2
EN

Stack Overflow用户

发布于 2019-03-23 10:44:18

诀窍是使用flatMap将不同的运行连接在一起:

代码语言:javascript
复制
let translate = a => a.flatMap(([s, n]) => Array(n).fill(s))

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

如果您的目标还不支持flatMap,那么等效的ES6习惯用法是[].concat(...map)

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55310003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档