如何将数组转换为对象?

826
什么是最好的转换方式:
['a','b','c']

到:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

2
如果其他人正在寻找Lodash解决方案,请考虑使用_.keyBy(以前称为_.indexBy):https://lodash.com/docs#keyBy - 2540625
1
这有点令人困惑,因为数组已经是对象了,但我猜问题的重点是将数组 异类对象转换为普通对象 - Oriol
3
使用 Lodash 来简单实现这个操作的方法是 _.toPlainObject。例如:var myObj = _.toPlainObject(myArr) - julian soro
46个回答

4
从Lodash 3.0.0版本开始,您可以使用_.toPlainObject函数。请参考官方文档了解更多信息。

var obj = _.toPlainObject(['a', 'b', 'c']);
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>


4
.reduce((o,v,i)=>(o[i]=v,o), {})

[docs]
或更详细
var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}

或者

var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})

"最短的使用原生JS的代码"
JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"

一些更复杂的例子。
[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}

更短的代码(使用 function(e) {console.log(e); return e;} 等同于 (e)=>(console.log(e),e)
 nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }

[/文档]


你在 [/docs] 中的意图是什么?将代码片段变为可执行的会更有用。 - Dan Dascalescu

4
如果您可以使用MapObject.assign,那么这很容易。
创建一个数组:
const languages = ['css', 'javascript', 'php', 'html'];

下面的代码创建了一个以索引作为键的对象:
Object.assign({}, languages)

使用地图复制上述步骤

将其转换为基于索引的对象{0:'css'}等...

const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript

将对象转换为基于值的对象 {css : 'css很棒'} 等...

const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great

请注意:您可以使用 Object.fromEntries(valueMap) 将 Map 转换为对象。 - JohnFlux

3

ES5 - 解决方案:

使用 Array 原型函数 'push''apply',您可以将数组元素填充到对象中。

var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj);    // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c


如果我想要转换成 { name: a, div :b, salary:c} 怎么办? - Prashant Pimpale

3

let i = 0;
let myArray = ["first", "second", "third", "fourth"];

const arrayToObject = (arr) =>
    Object.assign({}, ...arr.map(item => ({[i++]: item})));

console.log(arrayToObject(myArray));

或者使用

myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})


3
我会使用Array.of()来完成这个任务。 Array of能够将其上下文用作构造函数。

注意2:of函数是一个特意通用的工厂方法;它不要求它的this值是Array构造函数。因此,它可以被转移到或继承到其他构造函数中,这些构造函数可能会使用单个数字参数进行调用。

因此,我们可以将Array.of()绑定到一个函数,并生成类似数组的对象。

function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);

通过使用Array.of(),甚至可以进行数组子类化。点击此处了解更多信息。

3
如果有人在寻找 Typescript 方法,我写了这个:
const arrayToObject = <T extends Record<K, any>, K extends keyof any>(
  array: T[] = [],
  getKey: (item: T) => K,
) =>
  array.reduce((obj, cur) => {
    const key = getKey(cur)
    return ({...obj, [key]: cur})
  }, {} as Record<K, T>)

它将会:

  1. 强制第一个参数为对象数组
  2. 帮助选择键值
  3. 强制该键是所有数组元素的键

示例:

// from:
const array = [
    { sid: 123, name: 'aaa', extra: 1 },
    { sid: 456, name: 'bbb' },
    { sid: 789, name: 'ccc' }
];
// to:
{
  '123': { sid: 123, name: 'aaa' },
  '456': { sid: 456, name: 'bbb' },
  '789': { sid: 789, name: 'ccc' }
}

使用方法:

const obj = arrayToObject(array, item => item.sid) // ok
const obj = arrayToObject(array, item => item.extra) // error

这里有一个演示.


这很好,可以轻松修改以满足其他要求。 - Lasf
优秀的小解决方案,运行得很好! 如何像你的示例那样将输出更改为“123”:'aaa'? - Mecanik
修改后的函数,适用于任何想要实现我所需功能的人:const arrayToObject = <T extends Record<K, any>, K extends keyof any>( array: T[] = [], getKey: (item: T) => K, ) => array.reduce((obj, cur) => { const key = getKey(cur) return ({...obj, [key]: Object.entries(cur).reduce((str, [p, val]) => { return ${val}; }, '') }) }, {} as Record<K, T>); - Mecanik
不支持日期类型。尝试添加一个新的日期类型属性,然后选择它。 - Cristian E.

3

这是我刚写的一个递归函数。它很简单,而且运行得很好。

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

这是一个示例(jsFiddle):
var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;

array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;


console.log(array);

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}
console.log(convArrToObj(array));

结果: 递归数组转对象

非常好用。谢谢。 - Hanmaslah
如果你有['a' = '1', 'b' = '2', 'c' = '3'],并且想要得到{a: 1, b: 2, c: 3}这样的结果,那么这段代码应该放在更高的位置。 - Wanjia

3

尝试使用反射从数组项复制到对象。

var arr =['aa:23','bb:44','cc:55']
    var obj ={}
    arr.forEach(e => {
        var ee = e.split(':')
        Reflect.set(obj,ee[0],ee[1])
    });
    console.log(obj) // { aa: '23', bb: '44', cc: '55' }

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接