从单个数组转换为对象数组,其键来自 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' }
我收到来自 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' }