使用ES6功能将对象转换为数组

时间:2014-08-09 10:44:01

标签: javascript arrays ecmascript-6

给定一个javascript对象,如何将其转换为ECMAScript-6中的数组?

例如,给定:

 var inputObj = {a:'foo', b:[1,2,3], c:null, z:55};

预期输出为:

 ['foo', [1,2,3], null, 55]

结果中元素的顺序对我来说并不重要。

8 个答案:

答案 0 :(得分:78)

Array::map使用keys arrow function object iterator(仅限简短语法,不是功能):

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));

令人遗憾的是,没有{{3}}成为ES6原住民。

答案 1 :(得分:31)

只需使用Object.values

Object.values(inputObj); // => ['foo', [1,2,3], null, 55]

答案 2 :(得分:9)

这可以使用Array Comprehension syntax

来实现
[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 ]

答案 3 :(得分:8)

我喜欢旧学校的方式:

var i=0, arr=[];
for (var ob in inputObj)
  arr[i++]=ob;

如果不是upvotes,旧学校将大幅度赢得jsperf test。有时候新增加的是“错误特征”。"

答案 4 :(得分:2)

Array.map相当于@Bergi的箭头功能(有关Array.map的更多信息,请参阅MDN

var obj  = {a:'foo', b:[1,2,3], c:null, z:55}
   ,nwarr = Object.keys(obj).map( function (k) {return obj[k];} );

答案 5 :(得分:2)

更新2020年8月

作为总结,在ES6中,有以下三种(3)变体将对象转换为数组:

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 }

答案 6 :(得分:1)

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]

答案 7 :(得分:0)

use regex::Regex;

fn main() {
    let cd="rust";
    ok_but_i_dont_want_it(cd);
    compiler_err(cd);
}

fn ok_but_i_dont_want_it(cd:&str){
    let random_str="j93bg8";
    let reg_idnt=Regex::new(r"(?P<ident>[_A-Za-z]{1,}[_A-Za-z0-9]{0,})").unwrap();
    let cd=reg_idnt.replace_all(" rust ","${ident}_{}");
    println!("{}",cd);
}

fn compiler_err(cd:&str){
    let random_str="j93bg8";
    let reg_idnt=Regex::new(r"(?P<ident>[_A-Za-z]{1,}[_A-Za-z0-9]{0,})").unwrap();
    let cd=reg_idnt.replace_all(cd,format!("${ident}_{}",random_str));
    println!("{}",cd);
}

这里有两个对象,我将使用 2 种方法将两个对象分配到数组中

  1. error: there is no argument named `ident` --> src/main.rs:18:47 | 18 | let cd=reg_idnt.replace_all(cd,format!("${ident}_{}",random_str)); | ^^^^^^^ error[E0277]: expected a `FnMut<(&regex::Captures<'_>,)>` closure, found `String`

  2. const 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

这里我将 address2 分配到 (3) [Array(2), Array(2), Array(2)] 中,当你运行它时,你会得到这样的输出

var secstar = Object.keys(address2);
相关问题