【问题标题】:How can i get the key of Object inside Array?如何在数组中获取对象的键?
【发布时间】:2021-10-05 23:22:57
【问题描述】:

我有来自后端服务器的响应数据,如下例所示:

[
    {
        id: "haskjdhak",
        name: "lorem ipsun 1",
        desc: "any description 1"
    },
    {
        id: "78khasc",
        name: "lorem ipsun 2",
        desc: "any description 2"
    },
    {
        id: "56jkjn",
        name: "lorem ipsun 3",
        desc: "any description 3"
    }
]

我的目标是我想将响应数据分成标头和值,其中标头是key={id,name,desc},值是每个索引的值。 好吧,我举个例子,数据会变成表格数据,如下所示:

id name desc
haskjdhak lorem ipsun 1 any description 1
78khasc lorem ipsun 2 any description 2
56jkjn lorem ipsun 3 any description 3

我可以用什么方法来做呢?

【问题讨论】:

  • key 不能是对象权限。你想要一个连接的字符串?请发布所需的示例输出
  • 如果您展示转换后的数据应该是什么样子的示例,这将有助于阐明您的目标。听起来您需要遍历数组的成员并生成一个对象或Map
  • 或者您可能正试图将对象数组转换为表头由属性名称组成的表格矩阵,并且每一行的值是对应的值?它的描述方式为解释留下了空间;正如其他人所说,我们需要一个例子。
  • 是的,你是对的@Haroldo_OK
  • 所以,如果后端中的任何更改或更新(如标题)将更改名称或删除,或者添加另一个标题,我在前端的代码不会改变,因为我认为它会动态改变依赖数据来自后端

标签: javascript node.js arrays object


【解决方案1】:

阅读您问题的编辑,也许这更有用:

使用Map,对于每个key,您都有一个包含值的数组。

const response = [
    {id:"haskjdhak", name: "lorem ipsun 1", desc: "any description 1"},
    {id:"78khasc", name: "lorem ipsun 2", desc: "any description 2"},
    {id:"56jkjn", name: "lorem ipsun 3", desc: "any description 3"}
    ]
    
    const map = new Map();
    
    response.map(m => (Object.keys(m).forEach(e => {
      map.get(e) === undefined ? map.set(e, [m[e]]) : map.get(e).push(m[e])
    } )))

    map.forEach((value,key) => {
        console.log(`${key} = ${value}`);
    })

同样使用node.JS 直接使用console.log(map) 可以看到:

Map(3) {
  'id' => [ 'haskjdhak', '78khasc', '56jkjn' ],
  'name' => [ 'lorem ipsun 1', 'lorem ipsun 2', 'lorem ipsun 3' ],
  'desc' => [ 'any description 1', 'any description 2', 'any description 3' ]
}

这段代码从您的对象中获取所有键并使用该键创建一个Map。如果该键不存在任何值,则添加具有初始值的数组;如果存在一个值(不是undefined)它push() 是新值。

此外,通过这种方法,您的数据可以包含不同的键,例如,使用此条目数据:

const response = [
    { id: "haskjdhak", name: "lorem ipsun 1", desc: "any description 1" },
    { id: "78khasc", name: "lorem ipsun 2", desc: "any description 2" },
    { id: "56jkjn", name: "lorem ipsun 3", desc: "any description 3" },
    {
        id: "1"
    },
    {
        new: "value"
    },
    {
        id: "new", name: "new", desc: "new", other: "new"
    }
]

结果是:

Map(5) {
  'id' => [ 'haskjdhak', '78khasc', '56jkjn', '1', 'new' ],
  'name' => [ 'lorem ipsun 1', 'lorem ipsun 2', 'lorem ipsun 3', 'new' ],
  'desc' => [
    'any description 1',
    'any description 2',
    'any description 3',
    'new'
  ],
  'new' => [ 'value' ],
  'other' => [ 'new' ]
}

-- 原始答案--

如果我理解正确,你可以试试这个:

const response = [
{id:"haskjdhak", name: "lorem ipsun 1", desc: "any description 1"},
{id:"78khasc", name: "lorem ipsun 2", desc: "any description 2"},
{id:"56jkjn", name: "lorem ipsun 3", desc: "any description 3"}
]

var result = response.map(m => ({key:(Object.keys(m).join(",")), value:(Object.values(m).join(","))}))

console.log("result = ", result)

此代码创建一个包含key/value 对象的数组,其中key 是键(包含所有值的字符串),value 是相同的值。

【讨论】:

  • 只要原始数组中的所有对象都没有丢失的键或多余的键,并且键的顺序始终相同,就可以了。如果该条件有可能失败,则有必要采取额外措施。
  • 没错,我已经使用Map() 进行了更新,因为我认为这是解决问题的更好方法,并且还可以接受不同的对象键/值。
【解决方案2】:

这样的事情也许可以帮助你

yourArray.map(obj => ({key:"id, name, desc", value:`${obj.id}, 
${obj.name}, ${obj.desc}`}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多