Javascript:如何将嵌套的字符串数组拆分为数字

时间:2018-11-08 04:01:45

标签: javascript arrays

我有一个看起来像这样的数组

var a = [ 

      [ "1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526" ],
      [ "1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632" ]

    ];

我想将其拆分为

var b = [ "1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526" ]

var c =  [ "1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632" ]

进一步深入

var d = [ 1.31069258855609, 1.31213221536436, 1.31213221536436, 1.31288473199114 ]
var e = [ 103.848649478524, 103.848923050526, 103.848328363879, 103.849575392632 ]

我该怎么做?我尝试使用

之类的东西
.split(',')[0]
.split(',')[1]

但“”后有逗号。有人可以帮我吗?请谢谢!

5 个答案:

答案 0 :(得分:1)

您可以reduce进入一个数组,依次遍历每个子数组,然后遍历子数组项中的每个分割数:

const a = [
  ["1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526"],
  ["1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632"]
];
const [d, e] = a.reduce((a, arr) => {
  arr.forEach((item) => {
    item.split(',').map(Number).forEach((num, i) => {
      if (!a[i]) a[i] = [];
      a[i].push(num);
    });
  });
  return a;
}, []);
console.log(d);
console.log(e);

答案 1 :(得分:1)

解决此问题的一种方法是利用字符串数组中数字值的顺序。

首先将两个数组展平为单个数组,然后减少结果-在reduce操作的每次迭代中,将字符串,分成两部分,然后将每个部分的数字值放入基于该值的输出数组拆分索引:

var a = [ 
  [ "1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526" ],
  [ "1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632" ]
];

const result = a.flat().reduce((output, string) => {
  
  string.split(',')   // Split any string of array item 
  .map(Number)        // Convert each string to number
  .forEach((item, index) => {  
    output[index].push(item)  // Map each number to corresponding output subarray
  })
  
  return output
  
}, [[],[]]) 

const [ d, e ] = result

console.log( 'd = ', d )
console.log( 'e = ', e )

答案 2 :(得分:1)

这里有一种快速而肮脏的方法,基本上是递归地遍历数组,直到找到一个字符串为止,一旦在逗号处将其拆分,然后将结果添加到两个不同的数组中。最后,返回两个数组。

var a = [ 
    [ "1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526" ],
    [ "1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632" ]
];

function sort(array) {
  var a = [], b = [];
  function inner(c) {
    c.forEach(function (d) {
      if (Array.isArray(d)) {
        inner(d);
      } else {
        var e = d.split(',');
        a.push(e[0]);
        b.push(e[1]);
      }
    })
  }
  inner(array);
  return [a,b]
}
console.log(sort(a));

答案 3 :(得分:0)

请检查以下代码是否符合您的要求。

function test3(a) {
 let result = [];
 for (let i=0; i<a.length; i++) {
  let subArr = [];
  for (let j=0; j<a[i].length; j++) {
   let splits = a[i][j].split(',');
   subArr.push(splits[0]);
   subArr.push(splits[1]);
  }
  result.push(subArr);
 }
 console.log("Result ", result);
 return result;
}

然后调用以下代码:

var a = [[ "1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526" ], [ "1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632" ]];
var b = a[0]
var c = a[1]
var d = test3(a)[0]
var e = test3(a)[1]

答案 4 :(得分:0)

这是使用mapflatreduce的另一种解决方案。这个想法是获得所有数字的一个连续数组,然后使用reduce将交替的数字添加到2个不同的数组中:

const a = [
  ["1.31069258855609,103.848649478524", "1.31138534529796,103.848923050526"],
  ["1.31213221536436,103.848328363879", "1.31288473199114,103.849575392632"]
];

const [d, e] = a.map(arr => arr.map(s => s.split(',').map(s => parseFloat(s))))
                .flat(2)
                .reduce((acc, curr, i) => {
                  acc[i % 2].push(curr);
                  return acc;
                }, [[], []]);
           
console.log(d);
console.log(e);