我如何转换一个大对象数组与lodash?

var obj = {
  22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
  12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}

// transform to 
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]

当前回答

Var arr = _.map(obj)

你可以使用_。Map函数(包括lodash和下划线)和object,它将在内部处理这种情况,迭代每个值和键与您的迭代对象,并最终返回一个数组。事实上,如果你只是想要一个值数组,你可以使用它而不需要任何迭代对象(只要_.map(obj))。好的部分是,如果你需要中间的任何变换,你可以一次完成。

例子:

Var obj = { key1: {id: 1, name: 'A'}, key2: {id: 2, name: 'B'}, key3: {id: 3,名称:'C'} }; Var array1 = _。地图(obj, v = > v); console.log('数组1:',array1); /*实际上你不需要回调v=>v如果你 没有转换之间的任何东西,v=>v是默认*/ //如此简单,你可以使用 Var array2 = _.map(obj); console.log('数组2:',array2); < script src = " https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js " > < /脚本>

然而,如果你想转换你的对象,你可以这样做,即使你需要保留键,你可以这样做(_。Map (obj, (v, k) =>{…}),在Map中添加额外的参数,然后按您想要的方式使用它。

然而,还有其他香草JS解决方案(每个lodash解决方案都应该有纯JS版本),比如:

对象。键,然后将它们映射到值 对象。值(ES-2017) 对象。条目,然后映射每个键/值对(在ES-2017) 为…在循环中,并使用每个键feting值

还有更多。但是因为这个问题是针对lodash的(假设有人已经在使用它),所以如果找不到这些,你就不需要考虑太多关于版本、方法支持和错误处理的问题。

还有其他lodash解决方案,如_。值(对于特定的目的更易于阅读),或者获取对,然后映射等等。但如果你的代码需要灵活性,你可以在未来更新它,因为你需要保留键或转换值一点,那么最好的解决方案是使用单个_。映射在这个答案中。就可读性而言,这也不是那么难。

其他回答

_.toArray(obj);

输出为:

[
  {
    "name": "Ivan",
    "id": 12,
    "friends": [
      2,
      44,
      12
    ],
    "works": {
      "books": [],
      "films": []
    }
  },
  {
    "name": "John",
    "id": 22,
    "friends": [
      5,
      31,
      55
    ],
    "works": {
      "books": [],
      "films": []
    }
  }
]"

对象到数组

在所有的答案中,我认为这个是最好的:

let arr = Object.entries(obj).map(([key, val]) => ({ key, ...val }))

转换:

{
  a: { p: 1, q: 2},
  b: { p: 3, q: 4}
}

to:

[
  { key: 'a', p: 1, q: 2 }, 
  { key: 'b', p: 3, q: 4 }
]

数组到对象

变回来:

let obj = arr.reduce((obj, { key, ...val }) => { obj[key] = { ...val }; return obj; }, {})

将键保留在值中进行反向转换:

let obj = arr.reduce((obj, { key, ...val }) => { obj[key] = { key, ...val }; return obj; }, {})

将:

{
  a: { key: 'a', p: 1, q: 2 },
  b: { key: 'b', p: 3, q: 4 }
}

对于最后一个例子,你也可以使用lodash _。keyBy(arr, 'key')或_。keyBy(arr, i => i.key)。

2017年更新:对象。valuevalues, lodash values和toArray。为了保存键映射和展开操作符,请注意:

//从'lodash'导入{toArray, map} Const map = _.map Const input = { 关键:{ 价值:“价值” } } Const输出= map(input, (value, key) => ({ 键, 价值…… })) console.log(输出) // >> [{key: 'key', value: 'value'}]) < script src = " https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js " > < /脚本>

一个现代的本地解决方案,如果有人感兴趣:

const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));

或(不是IE):

const arr = Object.entries(obj).map(([key, value]) => ({ key, value }));

你可以这样做

var arr = _.values(obj);

有关文档请参见这里。