【问题标题】:Create an arrays inside of another (main) array out of separated values用分隔值在另一个(主)数组中创建一个数组
【发布时间】:2019-03-23 15:00:05
【问题描述】:

问题

我有一串用逗号分隔的数值,我想将它们包含在一个数组中,并且每一对都是嵌套在主数组中的数组,作为我的绘图顶点。

我该如何解决这个问题?

输入:

var vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";

我希望他们成为:

输出:

var V_array = [[24,13],[47,20],[33,9],[68,18],[99,14],[150,33],[33,33],[34,15],[91,10]];

【问题讨论】:

标签: javascript arrays multidimensional-array


【解决方案1】:

您可以Split on every second comma in javascript 并通过将值转换为数字来映射拆分对。

var vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10",
    result = vertices.match(/[^,]+,[^,]+/g).map(s => s.split(',').map(Number));

console.log(result);

【讨论】:

  • 附注:如果您使用exec,您可以节省映射匹配值所需的额外循环
【解决方案2】:

您可以使用函数reduce 对拆分字符串进行操作并检查每个索引的模式。

let str = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";

let result = str.split(',').reduce((a, s, i) => {
  a.curr.push(Number(s));
  if ((i + 1) % 2 === 0) {
    a.arr.push(a.curr);
    a.curr = [];
  }
  
  return a;
}, {arr: [], curr: []}).arr;

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

【讨论】:

  • 唯一缺少的是数组中的值仍然是字符串。你需要解析它们 mate :) 无论如何都是不错的解决方案 +1
  • @CodeManiac 哎呀!
【解决方案3】:

您可以将字符串拆分为数组并使用reduce 方法。看看下面的代码

const vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";

const numbers = vertices.split(',').map(Number)

const res = numbers
  .reduce((acc, number, index, srcArray) => {
    if (index % 2) {
      return acc
    }

    return [
      ...acc,
      [ number, srcArray[index + 1] ],
    ]
  }, [])

console.log(res)

【讨论】:

  • 值仍然是字符串。您需要将它们解析为数字伴侣
  • @CodeManiac 你是对的。我已经更新了我的答案。
【解决方案4】:

我的两分钱 :) [新版]

let
  str     = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10",
  pair    = [],
  triplet = [];

JSON.parse(`[${str}]`).forEach((e,i)=>{pair.push( (i%2)?[pair.pop(),e]:e)})

console.log ( 'pair:', JSON.stringify(pair) )


// bonus => same idea for triplet :

JSON.parse(`[${str}]`).forEach((e,i)=>{
  if      ( (i%3)===2 )  triplet.push( [triplet.shift(),triplet.pop(),e] )
  else if ( (i%3)===0 )  triplet.unshift(e)
  else                   triplet.push(e)
})

console.log ( 'triplet:', JSON.stringify(triplet)  )

【讨论】:

    【解决方案5】:

    您可以使用execJSON.parse

    var vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";
    
    var array1;
    var reg = /[^,]+,[^,]+/g
    let op = []
    
    while((array1 = reg.exec(vertices))!== null){
      op.push(JSON.parse(`[${array1[0]}]`))
    }
    
    console.log(op)

    【讨论】:

      【解决方案6】:

      拆分, 并使用Array.reduce 将这对组合成一个新的二维数组:

      var vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";
      const pair = vertices.split(",").reduce((acc, ele, idx, arr) => {
        if(idx === 0  || idx%2 === 0) {acc.push([+ele, +arr[idx + 1]]);}
        return acc;
      }, []);
      console.log(pair);

      同样可以使用Array.map 完成,如果索引是奇数则跳过元素并过滤掉undefined 元素:

      var vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";
      const pair = vertices.split(",").map((ele, idx, arr) => (idx === 0 || idx%2 === 0) ? [+ele, +arr[idx + 1]] : undefined).filter(e => e);
      console.log(pair);

      【讨论】:

      • 值仍然是字符串,您需要将它们解析为数字伴侣。
      【解决方案7】:

      我的两分钱:)

      (感谢 Code Maniac 提出使用 JSON.parse 的想法)

      let str = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";
      
      let result = JSON.parse(`[${str}]`).reduce((acc, cur, i) => {
        if (i===1) return [[acc,cur]]
      
        if (i%2)  acc.push( [acc.pop(), cur] )
        else      acc.push( cur )
      
        return acc
      });
      
      console.log ( result )

      【讨论】:

        【解决方案8】:

        这是我的解决方案。

        var vertices = "24,13,47,20,33,9,68,18,99,14,150,33,33,33,34,15,91,10";
        
        vertices = vertices.split(",");
        
        function convertToMultiArray (arr, length) {
          var nArr = [];
          while(arr.length > 0) {
        	  nArr.push(arr.splice(0,length));
          } 
          return nArr;
        }
        
        const res = convertToMultiArray(vertices, 2);
        
        console.log('res', res);

        【讨论】:

          猜你喜欢
          • 2018-04-17
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 2017-05-06
          • 2013-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多