如何将 javascript 对象转置为键/值数组

Posted

技术标签:

【中文标题】如何将 javascript 对象转置为键/值数组【英文标题】:How to transpose a javascript object into a key/value array 【发布时间】:2016-07-24 12:29:54 【问题描述】:

给定一个 javascript 对象,我如何将它转换为一个对象数组(每个对象都有键、值)?

例子:

var data =  firstName: 'John', lastName: 'Doe', email: 'john.doe@gmail.com' 

结果如下:

[
   key: 'firstName', value: 'John' ,
   key: 'lastName', value: 'Doe' ,
   key: 'email', value: 'john.doe@gmail.com' 
]

【问题讨论】:

【参考方案1】:

var data =  firstName: 'John', lastName: 'Doe', email: 'john.doe@gmail.com' 
var output = Object.entries(data).map(([key, value]) => (key,value));

console.log(output);

灵感来自post

【讨论】:

很好的答案。值得注意的是,REVERSE也可以做,即对象的键值: Object.fromEntries(data.map((key,value)=>([key, value])));【参考方案2】:

使用map函数

var data =  firstName: 'John', lastName: 'Doe', email: 'john.doe@gmail.com' ;

var result = Object.keys(data).map(key => ( key, value: data[key] ));

console.log(result);
    

【讨论】:

它是 ECMAScript 6 解决方案吗? @AlexanderPopov 是的,它是 arrow 函数 或更改变量名以键入地图并使用对象属性简写key => ( key, value: data[key] ) 【参考方案3】:

您可以迭代对象的属性并为每个属性创建一个新对象。

var data =  firstName: 'John', lastName: 'Doe', email: 'john.doe@gmail.com' ;
var result = [];

for(var key in data)

    if(data.hasOwnProperty(key))
    
        result.push(
            key: key,
            value: data[key]
        );
    

【讨论】:

hasOwnProperty 支持hasOwnProperty,但因为没有像@isvforall这样的功能性方式这样做而下降 @EmilOberg 没有以ES6 的方式这样做并不意味着这是一个不可靠(甚至更好且更具可读性)的答案。投反对票似乎很奇怪。 @roko-c-buljan,这与 ES6 无关。 Object.keysArray.map 都是不错的旧 EcmaScript 5.1。 (是的,@isvforall 使用的箭头函数是 ES6,但并不是答案中真正有趣的部分,例如查看@rob-brander 的答案) @EmilOberg—"没有 ES6 的内容" — 除了 ES6 位(箭头函数,速记属性)。 :-/【参考方案4】:

前面的回答让我觉得还有更好的办法……

Object.keys(data).map(function(key) 
  return  key, value: data[key] ;
);

或者在 ES6 中使用箭头函数:

Object.keys(data).map((key) => ( key, value: data[key] ));

【讨论】:

错误:Unexpected token : 啊,好抓;我已经修好了。我只是缺少箭头函数返回值周围的括号。【参考方案5】:

让您的生活更轻松,并使用带有地图的 es6 语法

    var output = Object.keys(data).map(key => 
      return 
        key: key,
        value: data[key]
      ;
    )

【讨论】:

【参考方案6】:
var result = [];
for(var k in data) result.push(key:k,value:data[k]);

【讨论】:

【参考方案7】:

或者疯狂地自定义 keyvalue 键:

module.exports = function objectToKeyValueArray(obj, keyName = 'key', valueName = 'value') 
    return Object
        .keys(obj)
        .filter(key => Object.hasOwnProperty.call(obj, key))
        .map(key => 
            const keyValue = ;
            keyValue[keyName] = key;
            keyValue[valueName] = obj[key];

            return keyValue;
        );
;

【讨论】:

【参考方案8】:

执行此操作的替代方法适用于多级对象并且不使用递归。

var output = []

    var o = 
      x:0,
      y:1,
      z:
        x0:
          x1:4,
          y1:5,
          z1:6
        ,
        y0:2,
        z0:[0,1,2],
      
    

    var  defer = [ [ o ,[ '_root_' ] ] ]
    var _defer = []


    while(defer.length)

    var current = defer.pop()

    var root    = current[1]
        current = current[0]


      for(var key in current )

        var path = root.slice()
            path.push(key)

        switch( current[key].toString() )
        case '[object Object]':
          _defer.push( [ current[key] , path ] )
        break;;
        default:
         output.push(
          path  : path ,
          value : current[key]
         )
        break;;
        
      

      if(!defer.length)
          defer = _defer.splice(0,_defer.length)
    

[
 path: [ '_root_', 'x' ], value: 0 ,
 path: [ '_root_', 'y' ], value: 1 ,
 path: [ '_root_', 'z', 'y0' ], value: 2 ,
 path: [ '_root_', 'z', 'z0' ], value: [ 0, 1, 2 ] ,
 path: [ '_root_', 'z', 'x0', 'x1' ], value: 4 ,
 path: [ '_root_', 'z', 'x0', 'y1' ], value: 5 ,
 path: [ '_root_', 'z', 'x0', 'z1' ], value: 6 
]

【讨论】:

【参考方案9】:

我会说使用 npm package flat。 非常适合嵌套对象和数组。

var flatten = require('flat')

flatten(
    key1: 
        keyA: 'valueI'
    ,
    key2: 
        keyB: 'valueII'
    ,
    key3:  a:  b:  c: 2   
)

// 
//   'key1.keyA': 'valueI',
//   'key2.keyB': 'valueII',
//   'key3.a.b.c': 2
// 

【讨论】:

【参考方案10】:
const array = [
     key: "key1", value: "value1" ,
     key: "key2", value: "value2" ,
];

const obj = Object.fromEntries(array.map(item => [item.key, item.value]));

console.log(obj);

【讨论】:

虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。这样,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能得到支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。【参考方案11】:

const array = [
     key: "key1", value: "value1" ,
     key: "key2", value: "value2" ,
];

const obj = Object.fromEntries(array.map(item => [item.key, item.value]));

console.log(obj);

【讨论】:

这是相反的方式

以上是关于如何将 javascript 对象转置为键/值数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将其转置为数组?

如何将列中的连接值转置为行

将 groupby 或 datetime 对象转换/拆分和转置为数据框

mysql 将行转置为列

将多行数据列转置为一列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列