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

3

我有一个像这样的数组

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个回答

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);


OP需要一个数字数组吗?即https://dev59.com/Ta_la4cB1Zd3GeqPwaoZ#53201463 - Dacre Denny
@CertainPerformance 我觉得你把数字搞混了。103.xx是一个独立的数组,而1.xx是另一个独立的数组。 - slider
好的,OP在我回答之后编辑了他期望的输出...正在编辑... - CertainPerformance

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 )


你的数字也混杂了。如果你仔细看,103.xx 数字会被放到一个数组中,而 1.xx 数字则会被放到另一个数组中。 - slider
1
@slider 感谢您的反馈-刚刚更新了答案,非常感谢 :-) - Dacre Denny

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));


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);


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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接