什么是最好的转换方式:
['a','b','c']
到:
{
0: 'a',
1: 'b',
2: 'c'
}
['a','b','c']
到:
{
0: 'a',
1: 'b',
2: 'c'
}
顺便说一句,另一种较新的方法是使用新的Object.fromEntries
与Object.entries
组合如下:
const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));
...它可以避免将稀疏数组项存储为undefined
或null
,并保留非索引(例如,非正整数/非数值)键。
{ 0: "a", 1: "b", 2: "c", "-2": "d", hello: "e" }
(与@Paul Draper的Object.assign
答案相同的结果.)
但是,你可能希望添加arr.length
,因为它没有包括在内:
obj.length = arr.length;
arr.entries()
代替 Object.entries(arr)
。 - Antoine Weber可以使用javascript#forEach
来完成这一操作。
var result = {},
attributes = ['a', 'b','c'];
attributes.forEach(function(prop,index) {
result[index] = prop;
});
使用ECMA6:
attributes.forEach((prop,index)=>result[index] = prop);
如果您的数组包含 由两个元素组成的数组,其中第一个元素是键,第二个元素是值,那么您可以使用 reduce
轻松地将其转换为对象。
[
["key1","value1"],
["key2", "value2"],
["key3", "value3"]
]
.reduce((acc, [key, value])=>({...acc, [key]: value}), {});
结果:
{
key1: 'value1',
key2: 'value2',
key3: 'value3'
}
如果你正在使用ES6,你可以使用Object.assign和展开运算符
{ ...['a', 'b', 'c'] }
如果您有像嵌套数组这样的结构:
var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
new Map([['key1', 'value1'], ['key2', 'value2']]);
- Shannon Hochkinsvar obj = {},
arr = ['a','b','c'],
l = arr.length;
while( l && (obj[--l] = arr.pop() ) ){};
{0:"c",1:"b",2:"a"}
。你可能想使用 unshift
,而不是 pop
或者(更好的方式)从 i=arr.length-1
开始,并递减。 - Phrogzl = arr.length
,然后 while (l && (obj[--l] = arr.pop())){}
(我知道这很老了,但为什么不进一步简化呢)。 - Qix - MONICA WAS MISTREATED简单粗暴 #2:
var i = 0
, s = {}
, a = ['A', 'B', 'C'];
while( i < a.length ) { s[i] = a[i++] };
i < a.length
而不是 a[i]
。 - Oriol更多浏览器支持和更加灵活的做法是使用普通的循环,示例如下:
const arr = ['a', 'b', 'c'],
obj = {};
for (let i=0; i<arr.length; i++) {
obj[i] = arr[i];
}
不过现代的方法可能是使用展开运算符,例如:
{...arr}
Object.assign({}, ['a', 'b', 'c']);
两者都会返回:
{0: "a", 1: "b", 2: "c"}
为什么没有人在ES6中尝试这个?
let arr = ['a','b','c']
let {...obj} = arr
console.log(obj) // {0: 'a', 1: 'b', 2: 'c'}
let {...obj2} = ['a','b','c']
console.log(obj2) // {0: 'a', 1: 'b', 2: 'c'}
这是一种非常简单的方法吗?
const obj = { ...input }
例子:
const inputArray = ["a", "b", "c"]
const outputObj = { ...inputArray }
function arrayToObject( srcArray ){
return JSON.parse( JSON.stringify( srcArray ) );
}
var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`
输出:
pork pie
检查类型:
typeof obj
"object"
如果没有原型方法,事情就不完整了。
Array.prototype.toObject =function(){
return JSON.parse( JSON.stringify( this ) );
}
使用方式:
var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`
输出:
cheese whizz
*注意:没有命名例程,如果您想要具体的名称,则需要继续使用下面的现有方法。
旧方法
这允许您从数组中生成一个对象,其中包含您按照所需顺序定义的键。
Array.prototype.toObject = function(keys){
var obj = {};
var tmp = this; // we want the original array intact.
if(keys.length == this.length){
var c = this.length-1;
while( c>=0 ){
obj[ keys[ c ] ] = tmp[c];
c--;
}
}
return obj;
};
result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);
console.log(">>> :" + result.onion);
将输出"paint",该函数需要具有相等长度的数组,否则将得到一个空对象。
这是更新后的方法。
Array.prototype.toObject = function(keys){
var obj = {};
if( keys.length == this.length)
while( keys.length )
obj[ keys.pop() ] = this[ keys.length ];
return obj;
};
_.keyBy
(以前称为_.indexBy
):https://lodash.com/docs#keyBy - 2540625_.toPlainObject
。例如:var myObj = _.toPlainObject(myArr)
。 - julian soro