['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"
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]);
30 回答
使用这样的函数:
你的数组已经或多或少只是一个对象,但是对于整数命名的属性,数组确实有一些“有趣”和特殊的行为 . 以上将给你一个简单的对象 .
编辑哦,你可能想要在数组中占到"holes":
在现代JavaScript运行时中,您可以使用
.reduce()
方法:那个也避免了数组中的"holes",因为这就是
.reduce()
的工作方式 .ECMAScript 6引入了易于聚合的Object.assign:
不会复制数组自己的
length
属性,因为它不可枚举 .此外,您可以使用ES6 spread syntax来实现相同的结果:
你可以使用累加器aka reduce .
传递一个空对象
{}
作为起点;然后"augment"该对象递增 . 在迭代结束时,result
将{"0": "a", "1": "b", "2": "c"}
如果您的数组是一组键值对对象:
将产生:
{a: 1, b: 2, c: 3}
为了完整起见,
reduceRight
允许您以相反的顺序迭代数组:将产生:
{c:3, b:2, a:1}
您的累加器可以是任何类型的特定用途 . 例如,为了在数组中交换对象的键和值,请传递
[]
:将产生:
[{1: "a"}, {2: "b"}, {3: "c"}]
与
map
不同,reduce
不能用作1-1映射 . 您可以完全控制要包含或排除的项目 . 因此reduce
允许你实现filter
的功能,这使reduce
非常灵活:将产生:
[{2: "b"}, {3: "c"}]
Caution :
reduce
和Object.key
是ECMA 5th edition
的一部分;你应该为不支持它们的浏览器提供polyfill(特别是IE8) .请参见Mozilla的默认实现 .
如果你正在使用jquery:
为了完整性,ECMAScript 2015(ES6)传播 . 将要求转换器(Babel)或至少运行ES6的环境 .
我可能会这样写(因为很少我手边没有下划线库):
这是一个O(1)ES2015方法,只是为了完整性 .
惊讶不见 -
现代JavaScript中的简单方法是使用
Object.assign()
,除了将key:value从一个对象复制到另一个对象之外什么都不做 . 在我们的例子中,Array
将属性捐赠给新的{}
.我们可以使用
Object.assign
和array.reduce
函数将Array转换为Object .我最终使用了对象扩展运算符,因为它是ECMAScript 2015(ES6)标准的一部分 .
以下以fiddle为例 .
五年后,有一个好方法:)
Object.assign在ECMAScript 2015中引入 .
你可以使用传播运营商
使用javascript#forEach就可以做到这一点
使用ECMA6:
快速而肮脏的一个:
如果您使用的是ES6,则可以使用Object.assign和spread运算符
如果您有嵌套数组
使用ES6 syntax你可以这样做:
快速而肮脏的#2:
我只想用
Array.of()
来做这件事 . Array of has the ability to use it's context as a constructor.所以我们可以将
Array.of()
绑定到一个函数并生成一个像object这样的数组 .利用
Array.of()
one can even do array sub-classing .从Lodash 3.0.0开始,您可以使用_.toPlainObject
这允许您从数组生成一个对象,该对象具有您按照所需顺序定义的键 .
console.log(">>> :" + result.onion);
将输出"paint",该函数必须具有相等长度的数组,否则您将得到一个空对象 .这是一个更新的方法
这是我刚写的一个递归函数 . 这很简单,效果很好 .
这是一个例子(jsFiddle):
结果:
[文档]
或者更详细
要么
最短的一个与香草JS
一些更复杂的例子
更短(使用
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/文档]
如果你可以使用
Map
或Object.assign
,那就很容易了 .创建一个数组:
下面创建一个索引为键的对象:
使用 Map 复制与上面相同的内容
转换为基于索引的对象
{0 : 'css'}
等...转换为基于值的对象
{css : 'css is great'}
等...FWIW,最近的另一种方法是使用新的
Object.fromEntries
和Object.entries
,如下所示:...允许避免将稀疏数组项存储为
undefined
或null
并保留非索引(例如,非正整数/非数字)键 .但是,有人可能希望添加
arr.length
,因为这不包括在内:你可以使用这样的函数:
这个应该更有效地处理稀疏数组 .
这是coffeescript的解决方案
如果你使用angularjs你可以使用angular.extend,与$ .extend的jquery效果相同 .
它并不直接相关,但我来到这里寻找一个用于合并嵌套对象的衬垫,例如
解决方案是使用reduce和object spread的组合:
或者使用