【问题标题】:How do I filter an object that is part of an array value?如何过滤作为数组值一部分的对象?
【发布时间】:2018-04-02 03:41:44
【问题描述】:

给定以下数据

[
  {
    "date": "2017-10-04",
    "games": [
      {
        "notes": "Game was played",
        "time": "2017-10-04T20:24:30+00:00",
        "sport": "hockey",
        "owner": "steve",
        "players": "10",
        "game_id": 1
      },
      {
        "notes": "Game was played",
        "time": "2017-10-04T12:35:30+00:00",
        "sport": "lacrosse",
        "owner": "steve",
        "players": "6",
        "game_id": 2
      },
      {
        "notes": "Game was played",
        "time": "2017-10-04T10:12:30+00:00",
        "sport": "hockey",
        "owner": "henry",
        "players": "10",
        "game_id": 4
      }
    ]
  },
  {
    "date": "2017-10-14",
    "games": [
      {
        "notes": "Game was played",
        "time": "2017-10-14T20:32:30+00:00",
        "sport": "hockey",
        "owner": "steve",
        "players": "4",
        "game_id": 3
      },
      {
        "notes": "Game was played",
        "time": "2017-10-14T20:34:30+00:00",
        "sport": "soccer",
        "owner": "john",
        "players": "12",
        "game_id": 5
      }
    ]
  }
]

如何过滤掉对象,以便只显示该日期的曲棍球比赛。本质上,我需要返回相同的对象数组,但只有当游戏键 = sport: hockey

时才应显示该对象

我知道我只能在数组上运行 filter 方法,但我不知道如何循环遍历数组内部的对象并再次返回整个对象。任何帮助将不胜感激。

【问题讨论】:

标签: javascript arrays loops object filter


【解决方案1】:

试试:

const filtered = yourArray.map(item => ({...item, games: item.games.filter(game => game.sport === 'hockey')})

// When run, this produces:
[
    {
        "date": "2017-10-04", 
        "games": [
            {
                "game_id": 1, 
                "notes": "Game was played", 
                "owner": "steve", 
                "players": "10", 
                "sport": "hockey", 
                "time": "2017-10-04T20:24:30+00:00"
            }, 
            {
                "game_id": 4, 
                "notes": "Game was played", 
                "owner": "henry", 
                "players": "10", 
                "sport": "hockey", 
                "time": "2017-10-04T10:12:30+00:00"
            }
        ]
    }, 
    {
        "date": "2017-10-14", 
        "games": [
            {
                "game_id": 3, 
                "notes": "Game was played", 
                "owner": "steve", 
                "players": "4", 
                "sport": "hockey", 
                "time": "2017-10-14T20:32:30+00:00"
            }
        ]
    }
]

我认为这就是你想要的。

【讨论】:

  • 嗨,CRice,感谢您抽出宝贵时间回答我,但这似乎不起作用......我基本上想弄清楚如何用日期和所有内容取回相同的数组比赛,但比赛应该只显示=曲棍球。
  • 我已经更新了我的答案,并在过滤器完成后提供了最终对象。看看它,如果那是你想要的,那很好,但如果不是这样,请告诉我你希望得到什么数据,我可以修改它来生成它。
  • 嗨,CRice,我在使用扩展运算符时一直出错,所以我使用了 date: item.date,这似乎有效。我遇到的唯一问题是,这也返回了没有任何曲棍球比赛的对象(游戏数组为空),但由于那天还有曲棍球以外的其他比赛,我只用游戏数组为空...这导致我渲染空组件...只是想知道是否有办法解决这个问题?我的实际数据比我上面给出的样本要大得多,所以有些日期没有曲棍球比赛。
  • 嗨,CRice,这基本上是正确的答案,如果有人想知道,为了过滤掉没有任何游戏的日期,只需对结果运行 for 循环并只推送那些长度 > 0 到一个新数组,你应该很好。
【解决方案2】:

我认为下面的代码应该可以解决问题:

var x=[
{
"date": "2017-10-04",
"games": [
  {
    "notes": "Game was played",
    "time": "2017-10-04T20:24:30+00:00",
    "sport": "hockey",
    "owner": "steve",
    "players": "10",
    "game_id": 1
  },
  {
    "notes": "Game was played",
    "time": "2017-10-04T12:35:30+00:00",
    "sport": "lacrosse",
    "owner": "steve",
    "players": "6",
    "game_id": 2
  },
  {
    "notes": "Game was played",
    "time": "2017-10-04T10:12:30+00:00",
    "sport": "hockey",
    "owner": "henry",
    "players": "10",
    "game_id": 4
  }
]
},
{
"date": "2017-10-14",
"games": [
  {
    "notes": "Game was played",
    "time": "2017-10-14T20:32:30+00:00",
    "sport": "hockey",
    "owner": "steve",
    "players": "4",
    "game_id": 3
  },
  {
    "notes": "Game was played",
    "time": "2017-10-14T20:34:30+00:00",
    "sport": "soccer",
    "owner": "john",
    "players": "12",
    "game_id": 5
  }
]
}]


function filterByDate (data, date){

   return data.filter(function(entry){
     return sameDay(new Date(entry.date), date)

   })
}

function filterBySport(data, sport){
   data.forEach(function(entry){
     entry.games=entry.games.filter(function(entry2){
        return entry2.sport===sport
     })
   })
   return data
 }

 function sameDay(date1, date2){ //helper function to check for date equality
   return date1.getFullYear()===date2.getFullYear() &&
          date1.getMonth()===date2.getMonth() &&
         date1.getDay()===date2.getDay() 
 }

 function myFilter(data, date, sportType){ // the final function you have to call
    return filterBySport(filterByDate(data, date), sportType)
 }

 console.log(myFilter(x, new Date("2017-10-04"), "hockey"))

【讨论】:

    【解决方案3】:

    让我们来一个数组:-

    let students = [
      {"Name": "Priya","marks": [50, 60, 70, 80, 90]},
      {"Name": "Ankita","marks": [80, 90, 95]}
    ]
    

    现在,我要过滤大于等于 90 的标记,代码如下所示。

    students.map((student) => {
      return {...student, 
              marks: student.marks.filter((mark) => mark >= 90)
             }
    }) 
    // Result will be [{"Name": "Priya", "marks": [90]}, {"Name": "Ankita","marks": [90,95]}]
    

    Spread operator 将扩展student,然后它将用filtered marks value 覆盖marks key

    如果你不使用扩展运算符,

    students.map((student) => student.marks.filter((mark) => mark >= 90))
    // Result will be [[90],[90]]
    

    然后您将只获得过滤后的值,而不是您尚未应用过滤器的值。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2017-06-21
      • 2017-10-19
      • 2016-10-08
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      相关资源
      最近更新 更多