角度:每行分割json数据

时间:2019-09-19 10:50:12

标签: javascript json angular

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

data: Array(8)
0: (3) ["test1", "4.96", "150"]
1: (3) ["test2", "156.16666666666666", "150"]
2: (3) ["test3", "279.3695652173913", "92"]
3: (3) ["test4", "1718", "16"]
4: (3) ["test5", "2.375", "16"]
5: (3) ["test6", "2230.6875", "16"]
6: (3) ["test7", "23.75", "32"]

我有一个拆分数组的方法:

data.forEach(test => {
    result.run.data.push([
        Number(test[0].split('test')[1]),
        Number(test[1])
    ]);

    result.count.data.push([
        Number(test[0].split('test')[1]),
        Number(test[2])
    ]);
});

如您所见,我在“测试”处拆分了数组。我的问题是,测试字符串可能会有所不同。我希望在json看起来略有不同(尽管结构相同)时执行相同的映射。

例如json数组如下:

 data: Array(8)
0: (3) ["asdf1", "4.96", "150"]
1: (3) ["fasd2", "156.16666666666666", "150"]
2: (3) ["qwer3", "279.3695652173913", "92"]
3: (3) ["llll4", "1718", "16"]
4: (3) ["rwwe5", "2.375", "16"]
5: (3) ["ttgd6", "2230.6875", "16"]
6: (3) ["34227", "23.75", "32"]

我希望它以与第一个数组相同的方式拆分。

如何更改我的方法以在每行的开头而不是字符串拆分数组?

4 个答案:

答案 0 :(得分:2)

您可以考虑使用正则表达式从字符串中提取数字,而不是拆分

console.log(/\d+/.exec('test1')) --> ["1"]

答案 1 :(得分:1)

您可以创建一个相同的函数并将参数作为参数传递给

spiltData(data,splitKey){
data.forEach(test => {
    result.run.data.push([
        Number(test[0].split(splitKey)[1]),
        Number(test[1])
    ]);

    result.count.data.push([
        Number(test[0].split(splitKey)[1]),
        Number(test[2])
    ]);
});
}

然后使用

 this.spiltData(data,'test')
 this.spiltData(data,'asdf')

我不确定result.countresult.run在这里,但您也可以将它们作为参数传递

更新

如果键可以是任何动态字符串,并且您不知道,并且字符串中只有一个数字,那么您可以使用regex to get the number from the end of a string显示您的代码应为

spiltData(data){
    data.forEach(test => {
        var matches=test[0].match(/\d+$/);
        result.run.data.push([
            Number( matches ? matches[0] : 0),
            Number(test[1])
        ]);

        result.count.data.push([
            Number(matches ? matches[0] : 0),
            Number(test[2])
        ]);
    });
    }

答案 2 :(得分:1)

只需替换Number(test[0].split('test')[1])

使用

Number(test[0].split('').filter(x => !isNaN(parseInt(x, 10))))

尝试这样:

this.data.forEach(test => {
  this.result.run.data.push([
    Number(test[0].split('').filter(x => !isNaN(parseInt(x, 10)))),
    Number(test[1])
  ]);

  ...
});

请参见Working Demo

答案 3 :(得分:1)

data.forEach(test => {
    result.run.data.push([
        Number(/(\d+)$/.exec(test[0])[1]),
        Number(test[1])
    ]);

    result.count.data.push([
        Number(/(\d+)$/.exec(test[0])[1]),
        Number(test[2])
    ]);
});