【问题标题】:Javascript: Filter a JSON conditionally based on the value of a key? [duplicate]Javascript:根据键的值有条件地过滤 JSON? [复制]
【发布时间】: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 和这种类型的对象,所以我有点不确定如何处理它。

【问题讨论】:

    标签: javascript node.js json api object


    【解决方案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 完全符合您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 2018-11-25
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多