1

我有一组称为系列的数据,包含 [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 等,但似乎没有一个能满足我的要求)。

4

1 回答 1

1

不确定以下是否可行,如果您的系列来自 JSON.parse 并且键 (x1,x2,x3...) 是非原语,那么它肯定不会因为在 ES 中({}==={})===false。所以在例子{complexKey:"x1"}中不等于{complexKey:"x1"}

如果您的键是字符串或数字(原始类型),则可以比较键,如果键是对象类型但引用相同的对象(如示例数据中称为org),那么它也可以工作。

如果您需要任何关于您的系列是什么、您遇到什么错误、您正在使用什么代码以及实际发生什么(请不要“不起作用”)的更多详细信息,请告诉我。

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

于 2018-02-04T05:42:04.920 回答