【问题标题】:Join first two elements and create new array?加入前两个元素并创建新数组?
【发布时间】:2018-08-18 10:57:12
【问题描述】:

在玩了几个小时join()slice() 函数之后,我发现你不能在复杂数组上使用这两个函数。所以我来这里寻求帮助。

我正在尝试获取以下数据:

 var data = [
            ["North", "Tennis",37, 25, 11, 9, 42, 13],
            ["East", "Football", 41, 2, 3, 26, 47, 21],
            ["South", "Rugby", 7, 22, 35, 45, 11, 46],
            ["West", "Rugby", 30, 21, 44, 23, 4, 47],
            ["North East", "Football", 35, 27, 12, 39, 34, 13],
            ["North West", "Football", 23, 4, 41, 35, 9, 47]
        ];

看起来像这样(输出):

var result = [
    ["North: Tennis", 37, 25, 11, 9, 42, 13],
    ["East: Football", 41, 2, 3, 26, 47, 21],
    ["South: Rugby", 7, 22, 35, 45, 11, 46],
    ["West: Rugby", 30, 21, 44, 23, 4, 47],
    ["North East: Football", 35, 27, 12, 39, 34, 13],
    ["North West: Football", 23, 4, 41, 35, 9, 47]
];

任何帮助将不胜感激

【问题讨论】:

  • 你想把你的数组转换成一个对象吗?
  • @MohammadUsman 一点也不,我的其余代码将使用数组。我只想重新格式化它,并在第一个索引之后附加一个冒号并删除逗号
  • 所以你想得到一个字符串作为输出?还是字符串数组?或者前两个元素由 : 连接的数组?还是……?
  • 一个数组数组,其中第一个元素由:连接

标签: javascript arrays multidimensional-array


【解决方案1】:

当您想将一个数组转换为另一个数组时,将原始数组.map 转换为另一个数组是有意义的,方法是获取每个子数组的前两个元素并将它们连接在一起,然后通过添加其余元素来构建一个新子数组将元素(我们在数组解构过程中使用 rest 参数获得)复制到包含连接字符串的新数组。

let data = [
  ["North", "Tennis",37, 25, 11, 9, 42, 13],
  ["East", "Football", 41, 2, 3, 26, 47, 21],
  ["South", "Rugby", 7, 22, 35, 45, 11, 46],
  ["West", "Rugby", 30, 21, 44, 23, 4, 47],
  ["North East", "Football", 35, 27, 12, 39, 34, 13],
  ["North West", "Football", 23, 4, 41, 35, 9, 47]
];

let result = data.map(([s1, s2, ...rest]) => [`${s1}: ${s2}`, ...rest]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

参考资料:

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您正在寻找以下输出。我已经使用 JavaScript 的 .map() 函数稍微重构了数据。 More information on .map here.

    var data = [
      ["North", "Tennis", 37, 25, 11, 9, 42, 13],
      ["East", "Football", 41, 2, 3, 26, 47, 21],
      ["South", "Rugby", 7, 22, 35, 45, 11, 46],
      ["West", "Rugby", 30, 21, 44, 23, 4, 47],
      ["North East", "Football", 35, 27, 12, 39, 34, 13],
      ["North West", "Football", 23, 4, 41, 35, 9, 47]
    ];
    
    const formattedData = data.map(row => {
    
      return [
        [row[0] + ': ' + row[1]],
        row[2],
        row[3],
        row[4],
        row[5],
        row[6],
        row[7]
      ];
    });
    
    console.log(formattedData);

    【讨论】:

      【解决方案3】:

      我会写你的代码。

      var data = [
        ["North", "Tennis", 37, 25, 11, 9, 42, 13],
        ["East", "Football", 41, 2, 3, 26, 47, 21],
        ["South", "Rugby", 7, 22, 35, 45, 11, 46],
        ["West", "Rugby", 30, 21, 44, 23, 4, 47],
        ["North East", "Football", 35, 27, 12, 39, 34, 13],
        ["North West", "Football", 23, 4, 41, 35, 9, 47]
      ];
      
      // Final resulting array is created by concatenating the first and
      // second index elements of each inner array of data. The rest data
      // is being copied as it is using slice and spread operator.
      const result = data.reduce(
        (mem, cur) => [...mem, [`${cur[0]}: ${cur[1]}`, ...cur.slice(2)]],
        []
      );
      
      console.log(result);

      【讨论】:

      • IMO:reduce 在这里使事情过于复杂,为什么不只是 map 呢?我投反对票的原因:我会编写你的代码。不是对正在发生的事情的描述。
      • @JonasWilms 这里没有什么好解释的,每一行都是自我解释的。要我解释每一行吗?我在这里只使用了一种方法.reduce。我应该对reduce 解释什么?
      • @JonasWilms 你从You can use .map() and some array destructuring...那里得到了什么解释?没什么..但我对这条线没意见..
      • @JonasWilms 这不是一个解释。它被提到是为了让像你这样快乐的人......我跳过了。我不打扰无缘无故争论的人..
      • @JonasWilms 什么样的答案is this mate ?您是否在这里付出了任何努力来解释而不是编写代码本身?先让自己变得像样,然后评论别人..也就是说,我将不再在这里发表评论..我只是试着忽略废话..
      【解决方案4】:

      您可以使用map 方法。它需要一个为每个元素执行的回调。然后它返回一个 new 数组,其中包含每个索引中的新数据。例如:

      var data = [
                  ["North", "Tennis",37, 25, 11, 9, 42, 13],
                  ["East", "Football", 41, 2, 3, 26, 47, 21],
                  ["South", "Rugby", 7, 22, 35, 45, 11, 46],
                  ["West", "Rugby", 30, 21, 44, 23, 4, 47],
                  ["North East", "Football", 35, 27, 12, 39, 34, 13],
                  ["North West", "Football", 23, 4, 41, 35, 9, 47]
              ];
              
              
      newData = data.map((el, i, arr) => {
        el[0] = `${el[0]}: ${el[1]}`   // reassinging el[0]
        el.splice(1, 1);               // removing 2 array element
       });
       
       
       
       

      【讨论】:

        猜你喜欢
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        相关资源
        最近更新 更多