Как фильтровать JSON Объект (JavaScript) - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь отфильтровать объект ниже JSON и вернуть массив объектов, в котором значение в ключе 'markdown' содержит, скажем, "steve" - ​​для этого я подозреваю, что мне нужно преобразовать объект в массив затем фильтр.

Я пытался использовать Object.entries

Object.entries(diagnosisData).filter(item => item === 'steve')

, а также JSON.parse, но думаю, что я лаю не на том дереве.

Я бы хотел бы вернуться сказать:

result = [
  {
    "id": "stevey",
    "markdown": "STEVEY",
    "source": null
  },
  {
    "id": "steven",
    "markdown": "STEVEN",
    "source": null
  }
]

Может ли кто-нибудь предложить мне указатель?

Большое спасибо

JSONdata = {
  "steven": {
    "id": "steven",
    "markdown": "STEVEN",
    "source": null
  },
  "john": {
    "id": "johnA",
    "markdown": "JOHNA",
    "source": null
  },
  "henry": {
    "id": "henryP",
    "markdown": "HENRYP",
    "source": null
  },
  "stevel": {
    "id": "steveL",
    "markdown": "STEVEL",
    "source": null
  }
}

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Попробуйте использовать Object.entries:

let filterKey = 'steve';
const result = Object.entries(JSONdata).filter(([k, v]) => k== filterKey);

, а затем Object.fromEntries() для создания объекта из списка пар ключ-значение:

Object.fromEntries(result)

Пример:

let JSONdata = {
   "steve": {
     "id": "steve",
     "markdown": "STEVE",
     "source": null
   },
   "john": {
     "id": "john",
     "markdown": "JOHN",
     "source": null
   },
   "henry": {
     "id": "henry",
     "markdown": "HENRY",
     "source": null
   },
 };

 let filterKey = 'steve';
 const result = Object.entries(JSONdata).filter(([k, v]) => k == filterKey);
 console.log(Object.fromEntries(result))

ОБНОВЛЕНИЕ:

Вы можете использовать метод startsWith, чтобы получить желаемый результат:

const result = Object.values(JSONdata).filter((v) => 
     v.id.startsWith(filterKey));

Пример:

let JSONdata = {
   "steveN": {
     "id": "steven",
     "markdown": "STEVEN",
     "source": null
   },
   "john": {
     "id": "johnA",
     "markdown": "JOHNA",
     "source": null
   },
   "henry": {
     "id": "henryP",
     "markdown": "HENRYP",
     "source": null
   },
   "steveL": {
     "id": "steveL",
     "markdown": "STEVEL",
     "source": null
   }
 }

 let filterKey = 'steve';
 const result = Object.values(JSONdata).filter((v) => 
     v.id.startsWith(filterKey));
 console.log(result)
1 голос
/ 15 апреля 2020

Вы почти там с вашим Object.entries(...).filter подходом. Однако я не уверен, что вы хотите фильтровать - ключи, значения id или значения markdown?

Чтобы избежать путаницы, допустим, у вас есть такой объект вместо этого:

const data = {
  keyA: {
    id: 'idA',
    markdown: 'markdownA'
  },
  keyB: {
    id: 'idB',
    markdown: 'markdownB'
  }
}

Тогда, просто для справки, функции Object.XX дают следующие результаты:

console.log(Object.keys(data))
// ['keyA', 'keyB']

console.log(Object.values(data))
// [
//   {id: 'idA', markdown: 'markdownA'},
//   {id: 'idB', markdown: 'markdownB'}
// ]

console.log(Object.entries(data))
// [
//   ['keyA', {id: 'idA', markdown: 'markdownA'}],
//   ['keyB', {id: 'idB', markdown: 'markdownB'}]
// ]

Итак:

Для фильтрации по ключу фильтра нет нужно вообще, если это идеальное совпадение, которое вы ищете:

const result = data.keyA
console.log(result) // {id: 'idA', markdown: 'markdownA'}

Если требуется не точное совпадение, хотя, например, все ключи, заканчивающиеся на A, вы можете использовать Object.entries(...).filter (а затем map к значению):

const result = Object.entries(data)
  .filter(([key, value]) => key.endsWith('A'))
  .map(([key, value]) => value)
console.log(result) // [{id: 'idA', markdown: 'markdownA'}]

Чтобы отфильтровать по одному из свойств (id или markdown), вы можете использовать Object.entries(...).filter, но так как вы не даже если вы заинтересованы в ключе, вы можете использовать Object.values(...).filter вместо:

const result = Object.values(data).filter(item => item.id === 'keyA')
console.log(result) // [{id: 'idA', markdown: 'markdownA'}]
0 голосов
/ 15 апреля 2020

Один из способов сделать это: Object.values(JSONdata).filter(o => o.id === 'steve')

Или, если у вас нет is и вы хотите сделать это по ключу:

const key = Object.keys(JSONdata).filter(o => o === 'steve');

console.log(JSONdata[key]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...