什么是最好的转换方式:
['a','b','c']
到:
{
0: 'a',
1: 'b',
2: 'c'
}
什么是最好的转换方式:
['a','b','c']
到:
{
0: 'a',
1: 'b',
2: 'c'
}
ECMAScript 6 引入了易于填充的Object.assign
:
该
Object.assign()
方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}
length
数组自己的属性不会被复制,因为它不可枚举。
此外,您可以在对象上使用 ES8扩展语法来实现相同的结果:
{ ...['a', 'b', 'c'] }
对于自定义键,您可以使用reduce:
['a', 'b', 'c'].reduce((a, v) => ({ ...a, [v]: v}), {})
// { a: "a", b: "b", c: "c" }
使用这样的功能:
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()
工作原理。
您可以使用累加器 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']);
为了完整起见,ECMAScript 2015(ES6) 正在传播。将需要转译器(Babel)或至少运行 ES6 的环境。
console.log(
{ ...['a', 'b', 'c'] }
)