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