【问题标题】:How to filter JSON Object (JavaScript)如何过滤 JSON 对象 (JavaScript)
【发布时间】:2020-04-15 12:54:04
【问题描述】:

我正在尝试过滤下面的 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
  }
}

【问题讨论】:

  • JSON object 在哪里?
  • 我认为您的 JSONData 应该是一个对象数组,或者至少您的人员列表应该全部在一个数组中。以内容命名的属性没有意义......

标签: javascript json filter


【解决方案1】:

您的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'}]

要按属性之一(idmarkdown)进行过滤,您可以使用 Object.entries(...).filter,但由于您甚至对密钥不感兴趣,您可以改用 Object.values(...).filter

const result = Object.values(data).filter(item => item.id === 'keyA')
console.log(result) // [{id: 'idA', markdown: 'markdownA'}]

【讨论】:

  • 非常有帮助,谢谢-我修改了问题以显示我正在寻找的结果-正在查看键(似乎是 Object.values)是要走的路...
  • 好的,但您是在id 还是markdown 中搜索?这对我来说仍然不清楚。以及依据什么标准?子串匹配?字符串的开始?字符串结束?是否区分大小写?
  • 只是猜测:要在 both id markdown 中搜索,匹配字符串开头不区分大小写,您可以使用 @987654341 @
  • 抱歉澄清 - 我正在查看降价 - 并希望返回包含字符串的对象数组 - 例如'steve'
  • 那么你只需要Object.values(JSONObject).filter(item => item.markdown.includes('STEVE'))
【解决方案2】:

尝试使用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)

【讨论】:

    【解决方案3】:

    一种方法是:Object.values(JSONdata).filter(o => o.id === 'steve')

    或者如果你没有 is 并且想通过 key 来做:

    const key = Object.keys(JSONdata).filter(o => o === 'steve');
    
    console.log(JSONdata[key]);
    

    【讨论】:

    • const key = 'steve' 会...更容易。
    • 当然可以,但根据需要,“史蒂夫”可能是一个变量
    • 是的,'steve' 只是一个变量。
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2023-04-09
    • 2019-10-02
    • 2022-01-08
    • 2019-10-07
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多