根据对象是否包含详细信息属性来过滤对象

时间:2019-03-23 20:08:50

标签: javascript javascript-objects

我有一个从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)

,如果我进行遍历,可以创建一个结果集-但看起来很麻烦。我确定有一个更简单的解决方案-我不在考虑。

3 个答案:

答案 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), {})