将 [2,x,y] 矩阵转换为 [y+1,2x] 以便在 dygraphs 中使用
Convert [2,x,y] matrix into [y+1,2x] for use in dygraphs
我有一组称为系列的数据,包含 [x,y] 对,格式为:
[
[x1,a1],
[x2,a2],
[x3,a3],
...
],[
[x4,b1],
[x1,b2],
[x5,b3],
...
]
需要组合这些多个集合(匹配 x 值)以适应 Dygraph 的数据格式,其中所有 x 值都是每个数组的第一个元素:
{
[x1,a1,b2],
[x2,a2,null],
[x3,a3,null],
[x4,null,b1],
[x5,null,b3]
...
}
我一直在尝试使用 ES6 函数来使这更容易,但由于我是 javascript 的新手,我很难找到一个好的(而且速度很快,因为它会处理大量数据)的方法这个。我想我遇到了更多麻烦,因为我不知道我正在尝试做的事情的术语,这使得谷歌搜索变得更加困难,因为我确信这个问题存在于某个地方。
我应该只使用一堆 for 循环来完成这项工作,还是有更好、更有效的方法来做到这一点?
谢谢。 (我正在使用 mathjs,如果它具有可以提供帮助的功能;我已经尝试过矩阵的重塑、concat 等,none 似乎可以满足我的要求)。
不确定以下是否可行,如果您的系列来自 JSON.parse 并且键(x1、x2、x3...)不是基元那么它肯定不会,因为在 ES ({}==={})===false
。所以在这个例子中 {complexKey:"x1"}
不等于 {complexKey:"x1"}
.
如果您的键是字符串或数字(原始类型),则可以比较键,如果键是对象类型但引用相同的对象(如示例数据中称为 org
),则它将工作也一样。
如果您需要任何帮助,了解有关您的系列的更多详细信息、您遇到的错误、您使用的代码是您期望的以及实际发生了什么,请告诉我(请不要 "doesn't work") .
const complexX1Key = {complexKey:"x1"};//object key x1
const org = [
[
[complexX1Key/* reference to x1 */,{complexValue:"a1"}],
[{complexKey:"x2"},{complexValue:"a2"}],
[{complexKey:"x3"},{complexValue:"a3"}]
],[
[{complexKey:"x4"},{complexValue:"b1"}],
[complexX1Key/* reference to x1 */,{complexValue:"b2"}],
[{complexKey:"x5"},{complexValue:"b3"}]
]
];
const toDygraph = org => {
const flatten = twoDArray =>
twoDArray.reduce(
(all,item)=>
all.concat(item),
[]
);
//get all keys (org[i][0])
const allKeys = flatten(org)
.map(([key])=>key)
.filter((x,index,all)=>all.indexOf(x)===index);//remove double keys
const result =
org//for each [[key:value],[key:value]]
.reduce(
(arr,keyValues)=>{//keyValues is [[key,value],[key,value]]
allKeys.forEach(//for every key in all keys
key=>{
//find an item [key,value] in current value set that has key
// of current key in all keys
const val = keyValues.find(([x])=>x===key);
//find in arr (arr is [[key],[key],[key]])
arr.find(([x])=>x===key)
//add the found value ([key,value]) to this [key] or add null if not found
.push((val&&val[1])||null);
}
)
return arr;
},
allKeys.reduce(//create an array of [[key1],[key2],[key3]]
(all,key)=>
all.concat([[key]]),
[]
)
);
return result;
}
console.log(
JSON.stringify(toDygraph(org),undefined,2)
);
我有一组称为系列的数据,包含 [x,y] 对,格式为:
[
[x1,a1],
[x2,a2],
[x3,a3],
...
],[
[x4,b1],
[x1,b2],
[x5,b3],
...
]
需要组合这些多个集合(匹配 x 值)以适应 Dygraph 的数据格式,其中所有 x 值都是每个数组的第一个元素:
{
[x1,a1,b2],
[x2,a2,null],
[x3,a3,null],
[x4,null,b1],
[x5,null,b3]
...
}
我一直在尝试使用 ES6 函数来使这更容易,但由于我是 javascript 的新手,我很难找到一个好的(而且速度很快,因为它会处理大量数据)的方法这个。我想我遇到了更多麻烦,因为我不知道我正在尝试做的事情的术语,这使得谷歌搜索变得更加困难,因为我确信这个问题存在于某个地方。
我应该只使用一堆 for 循环来完成这项工作,还是有更好、更有效的方法来做到这一点?
谢谢。 (我正在使用 mathjs,如果它具有可以提供帮助的功能;我已经尝试过矩阵的重塑、concat 等,none 似乎可以满足我的要求)。
不确定以下是否可行,如果您的系列来自 JSON.parse 并且键(x1、x2、x3...)不是基元那么它肯定不会,因为在 ES ({}==={})===false
。所以在这个例子中 {complexKey:"x1"}
不等于 {complexKey:"x1"}
.
如果您的键是字符串或数字(原始类型),则可以比较键,如果键是对象类型但引用相同的对象(如示例数据中称为 org
),则它将工作也一样。
如果您需要任何帮助,了解有关您的系列的更多详细信息、您遇到的错误、您使用的代码是您期望的以及实际发生了什么,请告诉我(请不要 "doesn't work") .
const complexX1Key = {complexKey:"x1"};//object key x1
const org = [
[
[complexX1Key/* reference to x1 */,{complexValue:"a1"}],
[{complexKey:"x2"},{complexValue:"a2"}],
[{complexKey:"x3"},{complexValue:"a3"}]
],[
[{complexKey:"x4"},{complexValue:"b1"}],
[complexX1Key/* reference to x1 */,{complexValue:"b2"}],
[{complexKey:"x5"},{complexValue:"b3"}]
]
];
const toDygraph = org => {
const flatten = twoDArray =>
twoDArray.reduce(
(all,item)=>
all.concat(item),
[]
);
//get all keys (org[i][0])
const allKeys = flatten(org)
.map(([key])=>key)
.filter((x,index,all)=>all.indexOf(x)===index);//remove double keys
const result =
org//for each [[key:value],[key:value]]
.reduce(
(arr,keyValues)=>{//keyValues is [[key,value],[key,value]]
allKeys.forEach(//for every key in all keys
key=>{
//find an item [key,value] in current value set that has key
// of current key in all keys
const val = keyValues.find(([x])=>x===key);
//find in arr (arr is [[key],[key],[key]])
arr.find(([x])=>x===key)
//add the found value ([key,value]) to this [key] or add null if not found
.push((val&&val[1])||null);
}
)
return arr;
},
allKeys.reduce(//create an array of [[key1],[key2],[key3]]
(all,key)=>
all.concat([[key]]),
[]
)
);
return result;
}
console.log(
JSON.stringify(toDygraph(org),undefined,2)
);