如何在Javascript数组中正确存储和格式化数据

如何在Javascript数组中正确存储和格式化数据,javascript,jquery,arrays,Javascript,Jquery,Arrays,我想使用该库,并使图形中显示的数据取决于用户输入的内容 现在,我不太确定如何以正确的格式获取数据,以便我可以将if用于库 目前,我在组合标签和值以使其与正确标签的正确索引匹配时遇到问题。 我有一个带有两个值的表(一个月(指定为一月、二月、三月、四月等)和一个数值) 现在我需要合并出现两次的月份,并添加与每个月份相关的值。我真的不知道我是应该使用2d数组还是2个数组。 比如说 var labels = ["Jan 17", "Jan 17", "Feb 17", "Mar 17", "Mar 17

我想使用该库,并使图形中显示的数据取决于用户输入的内容

现在,我不太确定如何以正确的格式获取数据,以便我可以将if用于库

目前,我在组合标签和值以使其与正确标签的正确索引匹配时遇到问题。 我有一个带有两个值的表(一个月(指定为一月、二月、三月、四月等)和一个数值)

现在我需要合并出现两次的月份,并添加与每个月份相关的值。我真的不知道我是应该使用2d数组还是2个数组。 比如说

var labels = ["Jan 17", "Jan 17", "Feb 17", "Mar 17", "Mar 17"];
var values = [10,10,25,40,100];
变成

var newlabels = ["Jan 17", "Feb 17", "Mar 17"];
var newvalues = [20,25,140];
var newgraphData =[["Jan 17", 20],["Feb 17",25],["Mar 17",140]];
或作为二维阵列:

var graphdata = [["Jan 17", 10],["Jan 17",10],["Feb 17",25],["Mar 17",40],["Mar 17",100]];
变成

var newlabels = ["Jan 17", "Feb 17", "Mar 17"];
var newvalues = [20,25,140];
var newgraphData =[["Jan 17", 20],["Feb 17",25],["Mar 17",140]];
两种方法都可以,但我不知道该用哪一种。此外,我还不太知道如何使用jQuery选择器和.map()函数获取2d数组中的数据


我曾考虑使用带有循环的.map()和.reduce()函数来遍历每个索引,但我似乎不太明白该怎么做。

试试这个。您将在数组
rLabels
rValues
中获得格式化数据

var labels = ["Jan 17", "Jan 17", "Feb 17", "Mar 17", "Mar 17"]
  , values = [10, 10, 25, 40, 100]
  , rLabels = []
  , rValues = [];
for (var i = 0; i < labels.length; i++) {
    var label = labels[i];
    var ind = rLabels.indexOf(label);
    if (ind == -1) {
        rLabels.push(label);
        rValues.push(values[i]);
    } else {
        rValues[ind] += values[i];
    }
}
var标签=[“1月17日”、“1月17日”、“2月17日”、“3月17日”、“3月17日”]
,值=[10,10,25,40,100]
,rLabels=[]
,r值=[];
对于(变量i=0;i
还有另一种方法,旨在将问题分解为更小的部分。一旦我们有了两个函数以高级方式转换数据,组装最终结果就变成了一项简单的任务

我们可以使用
zip

const None =
  Symbol ()

const zip = ([ x = None, ...xs ], [ y = None, ...ys ]) =>
  x === None || y === None
    ? []
    : [ [ x, y ] ] .concat (zip (xs, ys))

const labels =
  [ "Jan 17", "Jan 17", "Feb 17", "Mar 17", "Mar 17" ]

const values =
  [ 10, 10, 25, 40, 100 ]

console.log (zip (labels, values))
// [ [ 'Jan 17', 10 ]
// , [ 'Jan 17', 10 ]
// , [ 'Feb 17', 25 ]
// , [ 'Mar 17', 40 ]
// , [ 'Mar 17', 100 ] 
// ]

使用
[键,值]
对的列表,我们可以创建一个按
键对值进行分组的列表。多亏了这一点,地图变得闪电般的快。JavaScript为我们提供了映射,所以在适用时,最好使用它而不是普通对象。至少,避免使用
Array.prototype.indexOf
,就像一个答案所建议的那样,因为它使用的是数组,不适合较大的数据集

const group = (xs = []) =>
  xs.reduce ((acc, [ key, value ]) =>
    acc.has (key)
      ? acc.set (key, value + acc.get (key))
      : acc.set (key, value),
    new Map ())

console.log (group (zip (labels, values)))
// => Map { 'Jan 17' => 20, 'Feb 17' => 25, 'Mar 17' => 140 }
最后,我们可以使用

下面是一个运行示例

const无=
符号()
常量zip=([x=None,…xs],[y=None,…ys])=>
x==无| | y==无
? []
:[[x,y]].concat(zip(xs,ys))
常量组=(xs=[])=>
xs.reduce((acc,[键,值])=>
acc.has(钥匙)
?acc.set(键、值+acc.get(键))
:acc.set(键、值),
新地图())
常量main=(标签=[],值=[])=>
Array.from(组(zip(标签、值)).entries())
常量标签=
[“1月17日”、“1月17日”、“2月17日”、“3月17日”、“3月17日”]
常量值=
[ 10, 10, 25, 40, 100 ]
console.log(主(标签、值))
//[1月17日,20日]
//,[2月17日,25日]
//,[‘3月17日’,140]

//]
为什么不
[{'label':'Jan 17',val'100'},…]
是的,这可以工作,但是我如何组合重复的标签并添加相关的数值?
数组。原型。indexOf
消耗线性时间–使用Map进行分组可以在对数时间内完成。谢谢,这工作非常好@娜奥米克,你怎么用地图?