【问题标题】:Convert two-dimensional correlation matrix to javascript object [closed]将二维相关矩阵转换为javascript对象[关闭]
【发布时间】:2021-08-22 16:23:02
【问题描述】:

我有一个二维数组格式的相关表:

[
    [ 'xxx', 'abc', 'def', 'ghi'],
    [ 'abc',   '1', '0.5', '0.7'],
    [ 'def', '0.5',   '1', '0.9'],
    [ 'ghi', '0.7', '0.9',   '1'],
]

我需要将其作为 javascript 对象返回:

{ 
    'abc': {
        'abc': 1,
        'def': 0.5,
        'ghi': 0.7
    },
    'def': {
        'abc': 0.5,
        'def': 1,
        'ghi': 0.9
    },
    'ghi': {
        'abc': 0.7,
        'def': 0.9,
        'ghi': 1
    }
}

行/列未排序。

正在寻找解析数组的函数(大小约为 500x500)。

【问题讨论】:

  • 你试过什么?看来您没有尝试过。你应该做一些研究,尝试一些代码,如果你有任何具体问题,请回到这里。提示:阅读Array.reduce

标签: javascript arrays json dictionary


【解决方案1】:

您可以进行嵌套迭代并仅为不为零的索引分配值。

const
    data = [['xxx', 'abc', 'def', 'ghi'], ['abc', '1', '0.5', '0.7'], ['def', '0.5', '1', '0.9'], ['ghi', '0.7', '0.9', '1']],
    result = data.reduce((r, w, i, a) => {
        if (i) w.forEach((v, j, b) => {
            if (j) (r[b[0]] ??= {})[a[0][j]] = v;
        });
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    您可以先从第一行计算标题对象,作为稍后获取值的查找。

    然后从第二行开始,您可以迭代并使用上面构建的标头对象来检索适当索引处的值。

    const correlationMatrix = [
      ['xxx', 'abc', 'def', 'ghi'],
      ['abc', '1', '0.5', '0.7'],
      ['def', '0.5', '1', '0.9'],
      ['ghi', '0.7', '0.9', '1'],
    ];
    
    const toJavascriptObject = (correlationMatrix) => {
      const headerObj = correlationMatrix[0]
        .slice(1)
        .reduce((r, c, idx) => {
          r[idx] = c;
          return r;
        }, Object.create(null));
    
      return correlationMatrix
        .slice(1)
        .map((c) => {
    
          const obj = c
            .slice(1)
            .reduce((acc, curr, idx) => {
              acc[headerObj[idx]] = curr;
              return acc;
            }, Object.create(null));
    
          return {
            [c[0]]: obj
          };
        });
    };
    
    console.log(toJavascriptObject(correlationMatrix));

    【讨论】:

      【解决方案3】:

      您将需要减少数据条目;并在每个条目中减少字段。

      const matrixToObjectArray = (data) => {
        const [[, ...fields], ...entries] = data;
        return entries.reduce((acc, [ key, ...values ]) =>
          ({...acc, [key]: fields.reduce((record, field, index) =>
            ({ ...record, [field]: +values[index] }), {})}), {});
      };
      
      const data = [
        [ 'xxx' , 'abc' , 'def' , 'ghi' ],
        [ 'abc' ,   '1' , '0.5' , '0.7' ],
        [ 'def' , '0.5' ,   '1' , '0.9' ],
        [ 'ghi' , '0.7' , '0.9' ,   '1' ],
      ];
      
      const expected = { 
        'abc': { 'abc': 1   , 'def': 0.5 , 'ghi': 0.7 },
        'def': { 'abc': 0.5 , 'def': 1   , 'ghi': 0.9 },
        'ghi': { 'abc': 0.7 , 'def': 0.9 , 'ghi': 1   }
      };
      
      const actual = matrixToObjectArray(data);
      
      console.log(JSON.stringify(actual) === JSON.stringify(expected));
      console.log(actual);
      .as-console-wrapper { top: 0; max-height: 100% !important; }

      您可以通过使用 IIFE 将其变成单线:

      const matrixToObjectArray = (data) =>
        (([[, ...fields], ...entries]) =>
          entries.reduce((acc, [ key, ...values ]) =>
          ({...acc, [key]: fields.reduce((record, field, index) =>
            ({ ...record, [field]: +values[index] }), {})}), {}))
        (data);
      

      代码高尔夫乐趣(110 字节):

      // Where f = matrixToObjectArray
      f=(d)=>(([[,...g],...e])=>e.reduce((m,[k,...w])=>({...m,[k]:g.reduce((r,f,i)=>({...r,[f]:+w[i]}),{})}),{}))(d)
      

      【讨论】:

        【解决方案4】:

        阅读Array.reduce()Array.slice(1),然后尝试

        function arrayToColumnar(arr) {
          let cols = arr[0].slice(1);
          return arr.slice(1).reduce( (res,row) => {  // for each row
            res[row[0]] = // use the row name as field name
              row.slice(1).reduce( (a,e,i) => {  // then for each column 
                a[cols[i]] = e;  // use the column name as field name
                return a;  // return the row transformed into object
            },{}) 
            return res;  // return all rows transformed into object 
          },{})
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-23
          相关资源
          最近更新 更多