【问题标题】:Collating 2 dimensional array into array of objects with keys将二维数组整理成带有键的对象数组
【发布时间】:2020-04-22 19:08:06
【问题描述】:

对于我的一生,我无法弄清楚这一点。

我需要一个二维数组并在另一个数组中创建一个具有指定键名的对象数组。我该怎么做呢?

我正在尝试返回这样的对象:

需要的结果:

[
  {
    map: 'map-1',
    user: 'user-1',
    type: 'type-1',
    name: 'name-1',
    street: 'street-1' ,
    city: 'city-1'
  },
  {
    map: 'map-2',
    user: 'user-2',
    type: 'type-2',
    name: 'name-2',
    street: 'street-2' ,
    city: 'city-2'
  }
  ...
]

当前代码:

var collection = [
  ['map-1', 'map-2', 'map-3', 'map-4', 'map-5', 'map-6'],
  ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6'],
  ['type-1', 'type-2', 'type-3', 'type-4', 'type-5', 'type-6'],
  ['name-1', 'name-2', 'name-3', 'name-4', 'name-5', 'name-6'],
  ['street-1', 'street-2', 'street-3', 'street-4', 'street-5', 'street-6'],
  ['city-1', 'city-2', 'city-3', 'city-4', 'city-5', 'city-6']
];
var keys = [
  "map", "user", 'type', "name", "street", 'city'
]
const arrayColumn = (arr, n) => arr.map((x, i) => {
  return {[keys[i]]:x[n]}
});

let x = keys.map((x, i)=>{
  return arrayColumn(collection, i)
})
console.log(x)

【问题讨论】:

    标签: javascript arrays lodash


    【解决方案1】:

    使用_.unzip()将集合转置为行,然后映射转置后的集合,并通过_.zipObject()将每一行与键组合起来:

    const collection = [['map-1', 'map-2', 'map-3', 'map-4', 'map-5', 'map-6'], ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6'], ['type-1', 'type-2', 'type-3', 'type-4', 'type-5', 'type-6'], ['name-1', 'name-2', 'name-3', 'name-4', 'name-5', 'name-6'], ['street-1', 'street-2', 'street-3', 'street-4', 'street-5', 'street-6'], ['city-1', 'city-2', 'city-3', 'city-4', 'city-5', 'city-6']];
    const keys = ["map", "user", 'type', "name", "street", "city"];
    
    const result = _.unzip(collection).map(o => _.zipObject(keys, o));
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

    与 Lodash/fp 的想法相同 - 使用 _.flow() 生成一个函数,使用 _.unzip() 转置集合,并使用 _.zipObject() 映射以将每一行转换为一个对象:

    const fn = keys => _.flow(
      _.unzip,
      _.map(_.zipObject(keys)),
    )
    
    const collection = [['map-1', 'map-2', 'map-3', 'map-4', 'map-5', 'map-6'], ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6'], ['type-1', 'type-2', 'type-3', 'type-4', 'type-5', 'type-6'], ['name-1', 'name-2', 'name-3', 'name-4', 'name-5', 'name-6'], ['street-1', 'street-2', 'street-3', 'street-4', 'street-5', 'street-6'], ['city-1', 'city-2', 'city-3', 'city-4', 'city-5', 'city-6']];
    const keys = ["map", "user", 'type', "name", "street", "city"];
    
    const result = fn(keys)(collection);
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

    【讨论】:

      【解决方案2】:

      Reduce 函数在第一次检查时并不容易理解。查看ij,它们是在哪里创建的以及它们是如何使用的。

      var collection = [
        ['map-1', 'map-2', 'map-3', 'map-4', 'map-5', 'map-6'],
        ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6'],
        ['type-1', 'type-2', 'type-3', 'type-4', 'type-5', 'type-6'],
        ['name-1', 'name-2', 'name-3', 'name-4', 'name-5', 'name-6'],
        ['street-1', 'street-2', 'street-3', 'street-4', 'street-5', 'street-6'],
        ['city-1', 'city-2', 'city-3', 'city-4', 'city-5', 'city-6']
      ];
      var keys = [
        "map", "user", 'type', "name", "street", 'city'
      ];
      
      // Iterate over lenght of objects in inner array(s)
      var result = collection[0].map((_, j) => {
        // For every key, save value in an object under its name with value from collection at position of key index and index of item being created
        return keys.reduce((obj, key, i) => {
          obj[key] = collection[i][j];
          return obj;
        }, {});
      });
      
      console.log(result);

      【讨论】:

        【解决方案3】:

        您可以减少数组并使用所需属性构建新对象。

        var collection = [['map-1', 'map-2', 'map-3', 'map-4', 'map-5', 'map-6'], ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6'], ['type-1', 'type-2', 'type-3', 'type-4', 'type-5', 'type-6'], ['name-1', 'name-2', 'name-3', 'name-4', 'name-5', 'name-6'], ['street-1', 'street-2', 'street-3', 'street-4', 'street-5', 'street-6'], ['city-1', 'city-2', 'city-3', 'city-4', 'city-5', 'city-6']],
            keys = ["map", "user", 'type', "name", "street", 'city'],
            result = collection.reduce((r, a, i) => {
                a.forEach((v, j) => (r[j] = r[j] || {})[keys[i]] = v);        
                return r;
            }, []);
            
        console.log(result);
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

          【解决方案4】:

          var collection = [
            ['map-1', 'map-2', 'map-3', 'map-4', 'map-5', 'map-6'],
            ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6'],
            ['type-1', 'type-2', 'type-3', 'type-4', 'type-5', 'type-6'],
            ['name-1', 'name-2', 'name-3', 'name-4', 'name-5', 'name-6'],
            ['street-1', 'street-2', 'street-3', 'street-4', 'street-5', 'street-6'],
            ['city-1', 'city-2', 'city-3', 'city-4', 'city-5', 'city-6']
          ];
          var keys = [
            "map", "user", 'type', "name", "street", 'city'
          ]
          
          
          
          const result = Object
            .entries(collection)
            .reduce((acc, [,x], i) => {
              return x.map((y, j) => ({
                ...acc[j],
                [keys[i]]: y
              }))
            }, []);
          
          console.log(result);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-23
            • 2020-11-19
            • 2021-06-03
            • 1970-01-01
            相关资源
            最近更新 更多