【问题标题】:Looping over a bidimensional array and extract data to a new one循环遍历二维数组并将数据提取到新数组
【发布时间】:2018-11-03 00:36:36
【问题描述】:

我有一个像这样的二维数组

const bArray = 
[ [ 'Hello World',
    'Hi everybody',
    'How are you?'
  ],
  [ { text: 'Hola Mundo',
      from: [Object],
      raw: '' },
    { text: 'Hola a todos',
      from: [Object],
      raw: '' },
    { text: 'Cómo estás?',
      from: [Object],
      raw: '' },
  ]
]

结果我需要得到一个应该如下所示的数组:

[
 { en: 'Hello World',
   es: 'Hola Mundo' },

 { en: 'Hi everybody',
   es: 'Hola a todos' },

 { en: 'How are you?',
   es: 'Cómo estás?' },
]

这就是我的做法:

let val1 = bArray[0].map(tuple => tuple);
let val2 = bArray[1].map(tuple => tuple);

let result = val1.reduce((arr, v, i) => arr.concat({"en" : v, "es" : val2[i].text}), []);

现在在result 变量中,我只有一个数组,结果显示在前面。


我的问题?

是否有任何改进的方法可以让我获得相同的结果但代码行数更少?我的意思是,类似于mapreducefilterconcat 的组合,而无需创建两个单独的数组,如val1val2

【问题讨论】:

    标签: javascript arrays loops multidimensional-array


    【解决方案1】:

    我假设外部数组中只有两个数组。您只需在第一个数组上循环并从其他数组中相同索引的文本中选择文本并将它们合并到一个对象中。

    const bArray = 
    [ [ 'Hello World',
        'Hi everybody',
        'How are you?'
      ],
      [ { text: 'Hola Mundo',
          from: [],
          raw: '' },
        { text: 'Hola a todos',
          from: [],
          raw: '' },
        { text: 'Cómo estás?',
          from: [],
          raw: '' },
      ]
    ];
    
    let result = bArray[0].map((item, index) => {
       return {
         en: item,
         es: bArray[1][index].text
       };
    });
    
    console.log(result);

    【讨论】:

    • 有趣的答案!是的,外部数组中只有两个数组。
    【解决方案2】:

    如果你只是这样做:

    bArray[0].reduce((arr, v, i) => arr.concat({"en" : v, "es" : bArray[1][i].text}), []);
    

    你可以在一行中得到同样的东西。

    说明:

    let val1 = bArray[0].map(tuple => tuple);
    let val2 = bArray[1].map(tuple => tuple);
    

    这只是获取数组中的元素而已。与以下内容完全相同:

    let val1 = bArray[0];
    let val2 = bArray[1];
    

    所以我只是直接访问了您原始行中的bArray 索引。

    【讨论】:

    • 这个太棒了!正是我想要的。
    • Sim meu amigo, você está certo :)
    【解决方案3】:

    使用Array.prototype.forEach() 方法的另一个变体

    let result = [];
    bArray[0].forEach((item, index) => {
       result.push({
         en: item,
           es: bArray[1][index].text
       });
    });
    
    console.log(result);
    

    【讨论】:

    • 当然,forEach 也可以;而不是map,你不能返回这里,所以你需要在一个arraypush。容易明白。谢谢你的回答。
    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2016-07-02
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多