如何在ECMAScript-6中将JavaScript对象转换为数组?
例如,给定:
var inputObj = {a:'foo', b:[1,2,3], c:null, z:55};
预期输出应该是:
['foo', [1,2,3], null, 55]
对我来说,结果中元素的顺序并不重要。
如何在ECMAScript-6中将JavaScript对象转换为数组?
例如,给定:
var inputObj = {a:'foo', b:[1,2,3], c:null, z:55};
预期输出应该是:
['foo', [1,2,3], null, 55]
对我来说,结果中元素的顺序并不重要。
Array::map
与arrow function一起对keys
进行操作(仅限于短语法,不包含功能):let arr = Object.keys(obj).map((k) => obj[k])
真正的ES6风格是编写一个生成器,然后将其转换为可迭代的数组:
function* values(obj) {
for (let prop of Object.keys(obj)) // own properties, you might use
// for (let prop in obj)
yield obj[prop];
}
let arr = Array.from(values(obj));
遗憾的是,没有任何object iterator被纳入ES6本地支持。
map
比循环稍微慢一些。 - Bergimap
是慢的部分,而是由 Object.keys
创建的临时数组。如果您有一个不使用 Object.keys
的生成器函数,那么我期望它的速度会更接近于 for in
。 - andyReflect.enumerate(obj)
的函数可以完成功能。但我不知道它是否更快,特别是因为它似乎还没有在任何地方实现。顺便说一句,在V8中,Object.keys
实际上非常快,有时比for in
还要快。 - Bergi只需使用Object.values即可。
Object.values(inputObj); // => ['foo', [1,2,3], null, 55]
简而言之,在ES6中,将对象转换为数组有三种变化,如下所示:
const MyObjects = { key1: 'value 1', key2: 'value 2', };
// Method 1: Converts the keys to Array
// --------------------------------------
Object.keys(MyObjects);
// ['key1', 'key2']
// Method 2 Converts the Values to Array
// --------------------------------------
Object.values(MyObjects);
// ['value 1', 'value 2']
// Method 3 Converts both Values and Keys
// --------------------------------------
Object.entries(MyObjects);
// [ ['key1', 'value 1'], ['key2', 'value 2'] ]
将数组转换回对象可以按如下方式完成:
const array = [ ['one', 1], ['two', 2], ];
Object.fromEntries(array);
// { one: 1, two: 2 }
我喜欢老派的方式:
var i=0, arr=[];
for (var ob in inputObj)
arr[i++]=ob;
如果不考虑赞数,老派的方法在jsperf测试中大幅领先。有时候新加的功能反而是“误导性的特性”。
obj
是什么,为什么ob
是全局的? - Bergifor (let ob i inputObj)
。 - Bergifor(var ob in inputObj)
中的变量 ob
应该是一个属性键。所以在循环内部,它应该是 arr[i++]=inputObj[ob];
。这使得它比你现在拥有的代码慢22%。但它仍然比链接的jsperf中的其他代码快得多。 - jongo45[for (key of Object.keys(inputObj)) inputObj[key]]
使用示例:
var inputObj = {a:'foo', b:[1,2,3], c:null, z:55};
var arr = [for (key of Object.keys(inputObj)) inputObj[key]];
console.log(arr);
// prints [ 'foo', [ 1, 2, 3 ], null, 55 ]
ES7 的方法:
let obj = { a: "foo", b: "bar", c: 1, d: [1, 2, 3, 4] }
Object.values(obj)
// output --> ['foo', 'bar', 1, [1, 2, 3, 4]
Object.values()方法返回一个给定对象自己的可枚举属性值数组,顺序与for...in循环提供的相同(区别在于for-in循环也会枚举原型链中的属性)。
- DespertawebArray.map
等价于@Bergi的箭头函数(请参阅MDN了解有关Array.map
的更多信息)。
2020年编辑:转换为片段并添加了另一种替代方案
const obj = {
a: 'foo',
b: [1, 2, 3],
c: null,
z: 55
},
nwArr = Object.keys(obj).map(k => obj[k]),
// Alternative
nwArr2 = Object.fromEntries(Object.entries(obj));
nwArr.a = "bar";
nwArr2.a = "foobar"
console.log(`obj.a: ${obj.a}, nwArr.a: ${nwArr.a}, nwArr2.a: ${nwArr2.a}`);
Object.values(obj)
- leoconst address = {
street: "bew1111",
city: "err111",
country: "ind11"
};
const address2 = {
street: "bewscxsd",
city: "errdc",
country: "indcdsc"
};
这里有两个对象,我将使用两种方法将这两个对象分配给数组
Object.entries()
Object.keys()
第一个从这里开始-----
var firstar = Object.entries(address);
这里我将地址分配给firstar
,当您运行此代码时,您将获得以下输出
(3) [Array(2), Array(2), Array(2)]
第二个从这里开始
var secstar = Object.keys(address2);
我将address2分配给secstar
,当您运行它时,将会得到以下输出
(3) ["street", "city", "country"]