Javascript:根据键的值有条件地过滤 JSON? [复制]

Posted

技术标签:

【中文标题】Javascript:根据键的值有条件地过滤 JSON? [复制]【英文标题】:Javascript: Filter a JSON conditionally based on the value of a key? [duplicate] 【发布时间】:2019-03-18 05:06:30 【问题描述】:

在检索到这样的 JSON 后:

"JSON": [

  "mySchool": "college",
  "myHome": "apartment",
  "myFavoriteSport": "soccer"
,

  "mySchool": "highschool",
  "myHome": "house",
  "myFavoriteSport": "hockey"
,

  "mySchool": "college",
  "myHome": "box",
  "myFavoriteSport": "soccer"
,

  "mySchool": "elementary",
  "myHome": "tent",
  "myFavoriteSport": "soccer"

]

如何有条件地过滤它,以便...如果soccermyFavoriteSport 键的值,则返回包含myFavoriteSport: soccer 对的所有对象的数组?我确定我最终会将pushing对象放入数组中,但我不太清楚如何将其单独列出,以便将其分配给变量。

我确信它会涉及某种类型的循环,但这是我第一次使用 JSON 和这种类型的对象,所以我有点不确定如何处理它。

【问题讨论】:

【参考方案1】:

如果要过滤,请使用.filter - 只需检查myFavoriteSport 属性是否为soccer

const input = 
  "JSON": [
    
      "mySchool": "college",
      "myHome": "apartment",
      "myFavoriteSport": "soccer"
    ,
    
      "mySchool": "highschool",
      "myHome": "house",
      "myFavoriteSport": "hockey"
    ,
    
      "mySchool": "college",
      "myHome": "box",
      "myFavoriteSport": "soccer"
    ,
    
      "mySchool": "elementary",
      "myHome": "tent",
      "myFavoriteSport": "soccer"
    
  ]
;
console.log(
  input.JSON.filter(( myFavoriteSport ) => myFavoriteSport === 'soccer')
);

另请注意,JSON 是一种以字符串格式表示对象的方式。 (例如,

const myJSON = '["foo":"bar","baz":"buzz"]';

)。如果您有实际的对象/数组,那么它不是 JSON 格式 - 它只是一个普通对象。最好将密钥命名为 arrpersonArr 或类似的名称。 There's no such thing as a "JSON Object"

【讨论】:

所以我试了一下,收到了很多错误。 (node:62645) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'filter' of undefined at Object.module.exports.handler 就是其中之一 这是另一个at process._tickCallback (internal/process/next_tick.js:189:7) (node:62645) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catchblock, or by rejecting a promise which was not handled with .catch(). 您没有指定 "JSON" 属性所在的对象变量的名称,因此无法从这里准确说出代码应该是什么 - 无论变量名称是什么,将其替换为input 在我的答案中的代码中的位置。例如myObj.JSON.filter 或类似的东西。 我以为我确实是这样指定的 const data = JSON.parse(response); 然后在你的答案中使用代码 console.log( data.JSON.filter(( myFavoriteSport ) => myFavoriteSport === 'Soccer') ); 我 console.logged data 我知道它会正确记录 JSON【参考方案2】:

使用filter()数组方法很容易实现,有一个单一的解决方案:你可以在回调函数中指定一个条件,最后你会得到一个新的项目数组,它符合这个条件。

const JSON = [
  
    "mySchool": "college",
    "myHome": "apartment",
    "myFavoriteSport": "soccer"
  ,
  
    "mySchool": "highschool",
    "myHome": "house",
    "myFavoriteSport": "hockey"
  ,
  
    "mySchool": "college",
    "myHome": "box",
    "myFavoriteSport": "soccer"
  ,
  
    "mySchool": "elementary",
    "myHome": "tent",
    "myFavoriteSport": "soccer"
  
];

const result = JSON.filter(item => item.myFavoriteSport === 'soccer');
console.log(result);

您也可以使用许多其他数组迭代方法来实现这样的结果,但filter 完全符合您的需求。

【讨论】:

以上是关于Javascript:根据键的值有条件地过滤 JSON? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个参数的值有条件地禁用 Storybook 中的控件?

根据三列的值有条件地和交互地计算列

如何根据数据框中的值有条件地对数据进行分组?

如何根据 s-s-rS 中单独字段的值有条件地格式化整行的文本颜色?

knockoutjs 根据值有条件地设置图像 src

根据特定键的值条件从字典中导出键值对