从单个数组转换为对象数组,其键来自 JSON 响应 -JAVASCRIPT-

From single array convert to an array of object with keys coming from a JSON response -JAVASCRIPT-

我收到来自 API 电话的 json 回复。我需要存储它的键,并创建一个对象数组。我打算动态创建这个对象数组,而不管响应的键如何。

我已经拿到了这样的钥匙:

  const json_getAllKeys = data => {
   const keys = data.reduce((keys, obj) => (
      keys.concat(Object.keys(obj).filter(key => (
        keys.indexOf(key) === -1))
      )
    ), [])
    return keys 
}

返回数组(使用示例json):

['name','username', 'email']

但我正在尝试使用该数组创建一个看起来像这个的对象数组

[
    {
      name: "name",
      username: "username",
      email: "Email",
    }
];

我一直在尝试映射数组,但由于循环得到了多个对象,我需要一个对象才能使其工作。

keys.map(i=>({i:i}))

[
  { i: 'id' },
  { i: 'name' },
  { i: 'username' },
  { i: 'email' }
]

任何提示都会有用!

提前致谢:D

你绝对是在正确的轨道上。要记住的一件事是 map 函数将 return 相同数量的输出作为输入。因此,在您的示例中,一个包含 3 个 return 的数组是一个包含 3 个项目的数组。

因此,单靠地图并不能满足您的需求。您也许可以映射 => 减少它。但是,这里有一种使用 forEach 的方法。这不是一个严格的函数式编程风格的解决方案,但非常简单明了并且取决于用例,可能已经足够好了。

let keys = ['name','username', 'email'] //you have this array
const obj = {}; // empty object to hold result
keys.forEach(i => {
    obj[i] = i;  // set the object as you want
})

console.log(obj); // log out the mutated object
// { name: 'name', username: 'username', email: 'email' }

您要查找的是Object.fromEntries, which is ECMA2019, I believe, so available in Node >=14 and will be provided as a polyfill if you employ babel

我不太清楚你的 reduce 应该产生什么,但鉴于样本输入,我会写

const input = ['name','username', 'email'];

const result = Object.fromEntries(input.map(name => ([name, name])));
// result == { name: 'name', username: 'username', email: 'email' }