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

How to transpose a javascript object into a key/value array

本文关键字:数组 转换 javascript 对象      更新时间:2023-12-13

给定一个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' }
]

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

受到这篇文章的启发

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

您只需迭代对象的属性,并为每个属性创建一个新对象。

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

前面的答案让我认为有更好的方法。。。

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

或者在ES6中使用箭头功能:

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

只需让您的生活更轻松,并在地图中使用es6语法

    var output = Object.keys(data).map(key => {
      return {
        key: key,
        value: data[key]
      };
    })
var result = [];
for(var k in data) result.push({key:k,value:data[k]});

或者变为野生状态,使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;
        });
};

一种替代方法,适用于多级对象,不使用递归。

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 }
]

const array = [
    { key: "key1", value: "value1" },
    { key: "key2", value: "value2" },
];
const obj = Object.fromEntries(array.map(item => [item.key, item.value]));
console.log(obj);

我会说使用npm包平面。适用于嵌套对象和数组。

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
// }
const array = [
    { key: "key1", value: "value1" },
    { key: "key2", value: "value2" },
];
const obj = Object.fromEntries(array.map(item => [item.key, item.value]));
console.log(obj);