Фильтровать объект на основе того, содержат ли объекты свойство детализации - PullRequest
2 голосов
/ 23 марта 2019

У меня есть объект, который возвращается из API.

Я хочу легко обработать его в Javascript и вернуть только те тесты, которые имеют свойство "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 ]

2 голосов
/ 23 марта 2019

Вы можете отфильтровать записи и перестроить новый объект.

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 голос
/ 23 марта 2019

Используйте Object.entries(), чтобы получить массив пар ключ / значение тестов. Используйте Array.filter() для удаления пар, когда их details.type не является классом. Преобразовать обратно в объект через 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)
0 голосов
/ 23 марта 2019

Используйте метод 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), {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...