将数组转换为对象

JavaScript

MandyL

2020-03-12

转换的最佳方法是什么:

['a','b','c']

至:

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

第1292篇《将数组转换为对象》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

10个回答
卡卡西Green 2020.03.12

您可以使用如下函数:

var toObject = function(array) {
    var o = {};
    for (var property in array) {
        if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
            o[i] = array[i];
        }
    }
    return o;
};

这应该更有效地处理稀疏数组。

古一番长小小 2020.03.12

这是咖啡脚本中的解决方案

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj
TomGil村村 2020.03.12

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})

Tony米亚 2020.03.12

我会简单地用Array.of()数组可以将其上下文用作构造函数。

注2:功能是有意通用的工厂方法。它不需要其this值是Array构造函数。因此,它可以被其他构造函数传递或继承,这些构造函数可以使用单个数字参数调用。

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

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

通过利用Array.of() 甚至可以做数组子分类

Stafan小小斯丁 2020.03.12

这是我刚写的一个递归函数。它很简单,效果很好。

// 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));

结果: 递归数组到对象

乐小宇宙 2020.03.12

您可以使用点差运算符

x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
Gil逆天 2020.03.12

惊讶地没看到-

Object.assign({}, your_array)
米亚Stafan 2020.03.12

我们可以使用Object.assignarray.reduce函数将Array转换为Object。

var arr = [{a:{b:1}},{c:{d:2}}] 
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})

console.log(newObj)

凯斯丁 2020.03.12

这是O(1)ES2015方法,仅用于完整性考虑。

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object
Near路易小胖 2020.03.12

具有这样的功能:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

您的数组已经或多或少只是一个对象,但是对于整数命名属性,数组确实具有一些“有趣”的特殊行为。以上将为您提供一个简单的对象。

编辑哦,您也可能要考虑数组中的“孔”:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[i] = arr[i];
  return rv;
}

在现代JavaScript运行时中,可以使用以下.reduce()方法:

var obj = arr.reduce(function(acc, cur, i) {
  acc[i] = cur;
  return acc;
}, {});

那也可以避免数组中的“空洞”,因为这是.reduce()有效的。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android