['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" }
{ ...[sortedArray]}
- HappyHands31reduce
函数来实现: arr.reduce((a, v) => ({ ...a, [v]: v}), {})
,即可将数组转化为对象,对象的键值和原数组相同。 - David Hellsing使用以下这个函数:
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()
的工作原理。
const obj = arr.reduce((acc, cur, i) => ({ ...acc, [i]: cur }), {});
。 - huygnconst obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
- Marc Scheibarr.reduce((obj, cur, i) => (obj[i]=cur,obj), {});
呢? - miro您可以使用一个称为“累加器”的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
的一部分; 您应该为不支持它们的浏览器提供polyfill(特别是IE8)。
请参见Mozilla的默认实现:Mozilla。
如果您正在使用jQuery:
$.extend({}, ['a', 'b', 'c']);
{0: 'a', 1: 'b', 2: 'c'}
,这是一个预期的结果。 - ivkremerconsole.log(
{ ...['a', 'b', 'c'] }
)
如果您想使用迭代对象的属性作为键,例如:
// from:
const arr = [
{
sid: 123,
name: 'aaa'
},
{
sid: 456,
name: 'bbb'
},
{
sid: 789,
name: 'ccc'
}
];
// to:
{
'123': { sid: 123, name: 'aaa' },
'456': { sid: 456, name: 'bbb' },
'789': { sid: 789, name: 'ccc' }
}
使用:
const result = arr.reduce((obj, cur) => ({...obj, [cur.sid]: cur}), {})
这里很少有人评论Object.fromEntries
,我非常喜欢它,因为它更加简洁,而且与TypeScript易于集成,无需过多关注泛型和其他问题。如果需要,它还可以使用map来自定义键。缺点是:如果你想要自定义键,则需要额外的map
。例如:
const tags = [
{ name: 'AgeGroup', value: ageGroup },
{ name: 'ApparelTypes', value: apparelTypes },
{ name: 'Brand', value: brand },
// ...
]
const objectTags = Object.fromEntries(tags.map((t) => [t.name, t.value]))
/*
{
AgeGroup: 'Adult',
Apparel: 'Creeper, Jacket'
Brand: '',
// ...
}
*/
我可能会这样写(因为很少情况下我手头没有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
。总的来说,这个答案在多个层面上都不好。 - David HellsingObject.assign
和 array.reduce
函数将一个数组转换为对象。var arr = [{a:{b:1}},{c:{d:2}}]
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})
console.log(newObj)
arr = [{ b: 1, d: 2 }]
转换为对象。 - Timo这里只是为了完整性而提供的一个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
更好。 - OriolArray.isArray
对于这里的“object”返回true
,即使 instanceof Array
不返回... - Brett Zamir
_.keyBy
(以前称为_.indexBy
):https://lodash.com/docs#keyBy - 2540625_.toPlainObject
。例如:var myObj = _.toPlainObject(myArr)
。 - julian soro