首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用键将二维数组排序为对象数组

用键将二维数组排序为对象数组
EN

Stack Overflow用户
提问于 2020-04-22 19:08:06
回答 4查看 51关注 0票数 1

为了我的生命,我想不出这点。

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

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

需要的结果:

代码语言:javascript
复制
[
  {
    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'
  }
  ...
]

当前代码:

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-04-23 07:36:20

使用_.unzip()将集合转置到行,然后映射转置集合,并通过_.zipObject()将每一行与键组合。

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

与Lodash/fp一样,使用_.flow()生成一个函数,使用_.unzip()转换集合,并使用_.zipObject()映射将每一行转换为一个对象:

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }
代码语言:javascript
复制
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

票数 1
EN

Stack Overflow用户

发布于 2020-04-22 19:23:15

第一次检查时,减少功能从来就不容易理解。看看i & j,它们是在哪里创建的,它们是如何使用的。

代码语言:javascript
复制
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);

票数 1
EN

Stack Overflow用户

发布于 2020-04-22 19:35:00

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

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61373213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档