我从API接收了多个JSON(使用Promise.all()
进行了17次API调用)。例如
[
{
key: value,
key: value,
key: value,
key: value,
values: [
{
key: value,
key: value,
key: value,
keyIWant: value
}
{
key: value,
key: value,
key: value,
keyIWant: value
}
{
key: value,
key: value,
key: value,
keyIWant: value
}
]
}
{
key: value,
key: value,
key: value,
key: value,
values: [
{
key: value,
key: value,
key: value,
keyIWant: value
}
{
key: value,
key: value,
key: value,
keyIWant: value
}
{
key: value,
key: value,
key: value,
keyIWant: value
}
]
}
{
key: value,
key: value,
key: value,
key: value,
values: [
{
key: value,
key: value,
key: value,
keyIWant: value
}
{
key: value,
key: value,
key: value,
keyIWant: value
}
{
key: value,
key: value,
key: value,
keyIWant: value
}
]
}
]
我真的不知道得到我想要的密钥(以及更通用的方法)。到目前为止,我的尝试一直是
static _findKey(nestedData) {
const result = [];
const buffer = [];
for (const prop in nestedData) {
const value = nestedData[prop];
if (typeof value === "object") {
buffer.push(Class._findKey(value));
}
if (prop === "keyIWant") { // key would be an argument from the function if it'd worked
result.push(value); // doesn't work because of recursive call?
}
}
return result;
}
和
static _findKey(projects) { //
return projects.forEach(project => {
return project.values.forEach(projectValue => {
return projectValue.key;
});
});
}
你有更多想法吗?我还在学习JavaScript,因此想要一个干净而全面的解决方案,但不能自己构建一个。
答案 0 :(得分:2)
您可以使用以下功能获取存储在您指定的键上的所有值:
function getKeyValues(arr, key) {
return arr.reduce((a,b) => {
let keys = Object.keys(b);
keys.forEach(v => {
if (Array.isArray(b[v])) a = a.concat(getKeyValues(b[v], key));
if (v === key) a = a.concat(b[v]);
});
return a;
}, [])
}
使用
进行通话getKeyValues(arr, "keyIWant")
let arr = [{
key: 'foo',
values: [{
key: 'value',
keyIWant: 'keyIWant1'
},
{
key: 'value',
keyIWant: 'keyIWant2'
}, {
key: 'value',
keyIWant: 'keyIWant3'
}
]
},
{
key: 'foo',
values: [{
key: 'value',
keyIWant: 'keyIWant4'
},
{
key: 'value',
keyIWant: 'keyIWant5'
}, {
key: 'value',
keyIWant: 'keyIWant6'
}
]
}
];
function getKeyValues(arr, key) {
return arr.reduce((a, b) => {
let keys = Object.keys(b);
keys.forEach(v => {
if (Array.isArray(b[v])) a = a.concat(getKeyValues(b[v], key));
if (v === key) a = a.concat(b[v]);
});
return a;
}, []);
}
console.log(getKeyValues(arr, "keyIWant"));

答案 1 :(得分:0)
我们现在将object-scan用于像您这样的简单数据处理任务。一旦将头缠绕在它上,它就会非常强大。这是您回答问题的方式
const objectScan = require('object-scan');
const find = (input) => objectScan(['**.keyIWant'], { rtn: 'value' })(input);
const arr = [{"key":"foo","values":[{"key":"value","keyIWant":"keyIWant1"},{"key":"value","keyIWant":"keyIWant2"},{"key":"value","keyIWant":"keyIWant3"}]},{"key":"foo","values":[{"key":"value","keyIWant":"keyIWant4"},{"key":"value","keyIWant":"keyIWant5"},{"key":"value","keyIWant":"keyIWant6"}]}];
console.log(find(arr));
/* =>
[ 'keyIWant6',
'keyIWant5',
'keyIWant4',
'keyIWant3',
'keyIWant2',
'keyIWant1' ]
*/