如何在嵌套对象数组中找到特定键的所有值?
示例数据:
[
{
"id": 14252373,
"name": "foo",
"url": "/test",
"private": true,
"owner": {
"login": "username",
"id": 1217786,
},
"permissions": {
"admin": {
"id": 1567283
},
"push": false,
"pull": true
}
}
]
如何获取所有id
值的数组?
所需的输出:
[14252373, 1217786, 1567283]
答案 0 :(得分:0)
您可以创建一个函数并遍历传递的对象中的键。如果当前键与要查找的键相同,则将值添加到输出中。如果当前键是一个对象,则以当前值递归调用该函数
function getValue(o, findKey) {
const output = []
for (const k in o) {
if (k === findKey)
output.push(o[k])
else if (typeof o[k] === 'object')
output.push(...getValue(o[k], findKey))
}
return output;
}
getValue(input, 'id')
这是一个片段:
const input = [{
"id": 14252373,
"name": "foo",
"url": "/test",
"private": true,
"owner": {
"login": "username",
"id": 1217786,
},
"permissions": {
"admin": {
"id": 1567283
},
"push": false,
"pull": true
}
}]
function getValue(o, findKey) {
const output = []
for (const k in o) {
if (k === findKey)
output.push(o[findKey])
else if (typeof o[k] === 'object')
output.push(...getValue(o[k], findKey))
}
return output;
}
console.log(getValue(input, 'id'))
答案 1 :(得分:0)
有多种方法可以实现此目的。一种有趣的方法是将结构转换为JSON并使用正则表达式提取ID:
let ary =
[
{
"id": 14252373,
"name": "foo",
"url": "/test",
"private": true,
"owner": {
"login": "username",
"id": 1217786,
},
"permissions": {
"admin": {
"id": 1567283
},
"push": false,
"pull": true
}
}
];
let json = JSON.stringify(ary);
let idMatcher = /(?<="id":\s*)\d+/gmu;
let ids = json.match(idMatcher);
console.log(ids);
答案 2 :(得分:0)
您可以使用reduce
和recursive
函数。在reduce回调内部检查迭代中的当前项目是否是对象,如果是,则调用递归函数
let data = [{
id: 14252373,
name: "foo",
url: "/test",
private: true,
owner: {
login: "username",
id: 1217786
},
permissions: {
admin: {
id: 1567283
},
push: false,
pull: true
}
}];
let ids = data.reduce((acc, curr) => {
for (let keys in curr) {
if (keys === "id") {
acc.push(curr[keys]);
} else if (typeof curr[keys] === "object" && curr[keys] !== null) {
acc = recurObj(curr[keys], acc);
}
}
return acc;
}, []);
function recurObj(val, arr) {
for (let keys in val) {
if (keys === "id") {
arr.push(val[keys]);
} else if (typeof val[keys] === "object" && val[keys] !== null) {
recurObj(val[keys], arr);
}
}
return arr;
}
console.log(ids);
答案 3 :(得分:0)
由于它是一个对象数组,因此我认为简单的forEach会使其变得非常简单:
let data = [{
id: 14252373,
name: "foo",
url: "/test",
private: true,
owner: {
login: "username",
id: 1217786
},
permissions: {
admin: {
id: 1567283
},
push: false,
pull: true
},
},
{
id: 222222222,
name: "foo",
url: "/test",
private: true,
owner: {
login: "username",
id: 1217786
},
permissions: {
admin: {
id: 1567283
},
push: false,
pull: true
},
},
];
let everyID = [];
data.forEach(item => {
everyID.push(item.id);
});
console.log(everyID);
答案 4 :(得分:0)
我们现在使用object-scan来进行所有这样的数据处理。一旦将头放在如何使用上,它就会非常强大。这是您回答问题的方式
const objectScan = require('object-scan');
const find = (input) => objectScan(['**.id'], { rtn: 'value' })(input);
const arr = [{
id: 14252373,
name: 'foo',
url: '/test',
private: true,
owner: {
login: 'username',
id: 1217786
},
permissions: {
admin: {
id: 1567283
},
push: false,
pull: true
}
}];
console.log(find(arr));
// => [ 1567283, 1217786, 14252373 ]