将javascript关联数组转换为多对象数组

时间:2016-08-09 11:20:20

标签: javascript arrays

这是我的意见:

其中输入可能会收到更多数据,例如'e:5'

  var input = {a:2,b:3,c:2,d:1};

我想将此输入转换为以下输出:

var output = [{name="a",id="2"},
              {name="b",id="3"},
              {name="c",id="2"},
              {name="d",id="1"}];

提前感谢。

5 个答案:

答案 0 :(得分:2)

使用Array#map而不是Object.keys

  

Object.keys()方法返回给定对象自己的可枚举属性的数组。

  

map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。



var input = {
  a: 2,
  b: 3,
  c: 2,
  d: 1
};

var mapped = Object.keys(input).map(function(key) {
  return {
    name: key,
    id: input[key]
  };
});
console.log(mapped);




答案 1 :(得分:0)

使用Array#forEach可以Object.keys



var input = {a:2,b:3,c:2,d:1};
var output = [];
Object.keys(input).forEach(function(key){
  output.push({name:key,id:input[key]});
  })
console.log(output);




答案 2 :(得分:0)

Javascript对象属性是无序的。因此,从Object.keys返回的键的顺序未确定。为了保持字母顺序,例如您需要先键入sort,然后使用map创建一个具有预期值的新数组。

我不喜欢ES5。所以这是我的ES6答案。

Object.keys(input).sort((a, b) => a.localeCompare(b)).map(name => ({name, id: input[name]}));

答案 3 :(得分:0)

为了一些乐趣和培训目的,我们可能会想出这个。请记住,虽然以后可以添加,但是在实例化时,您始终可以通过构造函数嵌入Symbol.iterator方法,并且默认情况下您的对象可以迭代。

var input = {a:2,b:3,c:2,d:1},
   output = [];
input[Symbol.iterator] = function*(){
                           var ok = Object.keys(this),
                                i = 0;
                           while (i < ok.length) yield {[ok[i]]: this[ok[i++]]};
                         };
for (var keyValuePair of input) output.push(keyValuePair);
console.log(output);

// or you can even do like
output.length = 0;
output = [...input]; // cool
console.log(output);

答案 4 :(得分:0)

您也可以尝试以下方法:

var input = {a:2,b:3,c:2,d:1};

var output = Object.keys(input).reduce(function(p, c){
     return p.concat({name:c, id:input[c]});
}, []);