Answers:
ECMAScript 6引入了易于填充的内容Object.assign
:
该
Object.assign()
方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}
length
数组的自身属性不会被复制,因为它不可枚举。
另外,您可以使用ES6 传播语法来达到相同的结果:
{ ...['a', 'b', 'c'] }
{ ...[sortedArray]}
具有这样的功能:
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()
有效的。
[]
如果您不打算使用数字属性键和“ length”属性,那么创建一个Array实例()确实没有意义。
const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
您可以使用累加器aka reduce
。
['a','b','c'].reduce(function(result, item, index, array) {
result[index] = item; //a, b, c
return result;
}, {}) //watch out the empty {}, which is passed as "result"
以空物体{}
为起点;然后逐步“增强”该对象。在迭代结束时,result
将是{"0": "a", "1": "b", "2": "c"}
如果您的数组是一组键值对对象:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
var key = Object.keys(item)[0]; //first property: a, b, c
result[key] = item[key];
return result;
}, {});
将产生: {a: 1, b: 2, c: 3}
为了完整起见,reduceRight
允许您以相反的顺序遍历数组:
[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)
将产生: {c:3, b:2, a:1}
您的蓄能器可以是任何特定用途的类型。例如,为了交换数组中对象的键和值,请传递[]
:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
var key = Object.keys(item)[0]; //first property: a, b, c
var value = item[key];
var obj = {};
obj[value] = key;
result.push(obj);
return result;
}, []); //an empty array
将产生: [{1: "a"}, {2: "b"}, {3: "c"}]
与不同map
,reduce
不得用作1-1映射。您完全控制要包含或排除的项目。因此reduce
,您可以实现filter
功能,这使得功能reduce
非常广泛:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
if(index !== 0) { //skip the first item
result.push(item);
}
return result;
}, []); //an empty array
将产生: [{2: "b"}, {3: "c"}]
注意:reduce
和Object.key
是的一部分ECMA 5th edition
;您应该为不支持它们的浏览器(尤其是IE8)提供一个polyfill。
查看Mozilla的默认实现。
如果您使用的是jquery:
$.extend({}, ['a', 'b', 'c']);
{0: 'a', 1: 'b', 2: 'c'}
预期的结果。
为了完整起见,ECMAScript 2015(ES6)不断扩展。需要使用Transpiler(Babel)或至少运行ES6的环境。
console.log(
{ ...['a', 'b', 'c'] }
)
我可能会这样写(因为很少有我手头没有underscorejs库):
var _ = require('underscore');
var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }
obj=_.extend({},a);
做一个简单的工作即可。另外,如果您要遍历数组,我会说_.each
比更为合适_.map
。总而言之,这在几个层面上都不是一个好的答案。
这是一个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
length
财产。(3)对象仍然是数组Array.isArray(arr) === true
。(4)不会删除特殊的数组行为,例如,arr.length = 0
删除所有索引。(5)因此,我认为Object.assign
更好。
Array.isArray
返回true
“对象” instanceof Array
……
惊讶地没看到-
console.log(
Object.assign({}, ['a', 'b', 'c'])
)
{ "first":"a", "second":"b","third":"c" }
与键固定-我要寻找一个自毁
我最终使用对象传播运算符,因为它是ECMAScript 2015(ES6)标准的一部分。
const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}
下面以小提琴为例。
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}
在现代JavaScript中,简单的方法是使用Object.assign()
它,除了将key:value从一个对象复制到另一个对象外,什么也没有做。在我们的例子中,Array
将属性捐赠给new {}
。
O.assign
但上述答案仅存在于上面,但缺乏解释。如今,将数组分解为对象是一种方法({...array}
)
对于ES2016,对象的散布运算符。注意:这是在 ES6 之后的,因此需要对Transpiler进行调整。
const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"}
五年后,有个好方法:)
Object.assign
是ECMAScript 2015中引入的。
Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
使用 javascript#forEach
一个可以做到这一点
var result = {},
attributes = ['a', 'b','c'];
attributes.forEach(function(prop,index) {
result[index] = prop;
});
使用ECMA6:
attributes.forEach((prop,index)=>result[index] = prop);
FWIW的另一种最新方法是将新方法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
并保留非索引键(例如,非正整数/非数字键)。
arr.length
但是,不妨增加一点,因为其中不包括:
obj.length = arr.length;
如果您使用的是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']]);
快速而肮脏的一个:
var 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
and减量开始。
l = arr.length
,然后while (l && (obj[--l] = arr.pop())){}
(我意识到这已经很老了,但是为什么不进一步简化它)。
从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>
这是我刚写的一个递归函数。这很简单,效果很好。
// 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));
结果:
['a' = '1', 'b' = '2', 'c' = '3']
并希望它像{a: 1, b: 2, c: 3}
这样完美运行,则应该更高一些。
.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]
[/docs]
什么?使代码片段可执行将更有用。
我会简单地用Array.of()
。数组可以将其上下文用作构造函数。
注2:功能是有意通用的工厂方法;它不需要其this值是Array构造函数。因此,它可以被其他构造函数传递或继承,这些构造函数可以使用单个数字参数调用。
因此,我们可以绑定Array.of()
到一个函数并生成一个类似于对象的数组。
function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);
通过利用Array.of()
甚至可以做数组子分类。
如果可以使用Map
或Object.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 is great'}
等...
const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great
快速将项目数组转换为对象的简便方法
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;
};
ES5-解决方案:
使用数组原型函数“ 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}
您可以使用如下功能:
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;
};
这应该更有效地处理稀疏数组。