我有一个从API返回的对象。
我想用Java语言轻松处理它,并且仅返回具有“ Grade”属性的测试。
对象的结构如下:
{
"ScoreCard": {
"tests": {
"test1": {
"id": 100,
"score": 0,
"details": {
"type": "table"
}
},
"test2": {
"id": 200,
"score": 1,
"details": {
"type": "Grade"
}
},
//moretests
}
是否可以使用“过滤器”之类的简单方法来做到这一点?
我知道我可以使用
从对象获取密钥。var keys = object.keys(response)
,如果我进行遍历,可以创建一个结果集-但看起来很麻烦。我确定有一个更简单的解决方案-我不在考虑。
答案 0 :(得分:2)
您可以过滤条目并重建新对象。
var object = { ScoreCard: { tests: { test1: { id: 100, score: 0, details: { type: "table" } }, test2: { id: 200, score: 1, details: { type: "Grade" } } } } },
result = Object.assign(...Object
.entries(object.ScoreCard.tests)
.filter(({ 1: { details: { type } } }) => type === 'Grade')
.map(([k, v]) => ({ [k]: v }))
);
console.log(result);
答案 1 :(得分:1)
使用Object.entries()
获取测试键/值对的数组。当成对的details.type
不是成绩时,使用Array.filter()
删除成对的。通过Array.reduce()
转换回对象:
const response = {"ScoreCard":{"tests":{"test1":{"id":100,"score":0,"details":{"type":"table"}},"test2":{"id":200,"score":1,"details":{"type":"Grade"}}}}}
const result = Object.entries(response.ScoreCard.tests)
.filter(([,v]) => v.details.type === 'Grade')
.reduce((r, [k, v]) => ({ ...r, [k]: v }), {})
console.log(result)
答案 2 :(得分:0)
使用Object.entries
方法获取每个键值对,然后使用Array#reduce
方法遍历数组并生成一个组合对象。
const data = {
"ScoreCard": {
"tests": {
"test1": {
"id": 100,
"score": 0,
"details": {
"type": "table"
}
},
"test2": {
"id": 200,
"score": 1,
"details": {
"type": "Grade"
}
},
//moretests
}
}
}
let o;
let res = Object.entries(data.ScoreCard.tests).reduce((obj, [k, o]) => {
if (o.details.type === "Grade") obj[k] = o;
return obj
}, {})
console.log(res)
单线解决方案:
let res = Object.entries(data.ScoreCard.tests).reduce((obj, [k, o]) => (o.details.type === "Grade" && obj[k] = o[k], obj), {})