【问题标题】:Creating a new array by comparing an array of objects to an array通过将对象数组与数组进行比较来创建新数组
【发布时间】:2017-08-01 17:27:15
【问题描述】:

我有一个 gameData 列表和使用过的运动员。我需要创建一个新数组,该数组仅包含 gameData 中的 Athlete,而该数组不在 usedAthletes 中。老实说,在过去一天左右的时间里,我已经到处查看,尝试了 lodash 和各种东西。任何建议都会很棒。如果有 ES6 方法可以工作,知道这一点也很酷:)

const gameData = [
        {Athlete: "Peyton Manning", Img: "url"},
        {Athlete: "Tony Hawk", Img: "url"},
        {Athlete: "Tom Brady", Img: "url"},
        {Athlete: "Usain Bolt", Img: "url"},
        {Athlete: "Kevin Durant", Img: "url"},
        {Athlete: "Cristiano Ronaldo", Img: "url"},
        {Athlete: "Michael Phelps", Img: "url"},
        {Athlete: "Conor McGregor", Img: "url"},
        {Athlete: "Phil Mickelson", Img: "url"},
        {Athlete: "Stephen Curry", Img: "url"},
        {Athlete: "Rory McIlroy", Img: "url"},
        {Athlete: "Mike Trout", Img: "url"},
        {Athlete: "Danica Patrick", Img: "url"},
        {Athlete: "Drew Brees", Img: "url"},
        {Athlete: "Carmelo Anthony", Img: "url"},
        {Athlete: "Ryan Lochte", Img: "url"},
        {Athlete: "Eli Manning", Img: "url"},
        {Athlete: "Chris Paul", Img: "url"}
]

const usedAthletes = ["Peyton Manning", "Tony Hawk", "Tom Brady"];

gameData.forEach( x => {
  const gameDataNamesOnly = x.Athlete;
  newAnswerlist = [];
  usedAthletes.forEach( item => {
    if(gameDataNamesOnly != item){
        //I was trying to push to newAnswerList here but could get access to gameDataNamesOnly correctly or something.
    }
  })
  console.log(newAnswerlist)
})

【问题讨论】:

    标签: javascript arrays object lodash


    【解决方案1】:

    使用过滤器后跟地图,

    const newAnswerlist = gameData
    .filter(data => usedAthletes.indexOf(data.Athlete) !== -1)
    .map(data => data.Athlete);
    

    如果您也想要 img 信息,请仅使用过滤器,

    const newAnswerlist = gameData
    .filter(data => usedAthletes.indexOf(data.Athlete) !== -1);
    

    【讨论】:

    • 我试过了,但是当我在控制台登录 newAnswerlist 时,它返回一个空数组。
    • @SirFry Athelete 有错别字,改成Athlete
    • lul 我也错过了,抱歉现在工作。感谢您的帮助!
    【解决方案2】:

    您可以将Array#filterArray#includes 一起使用,并排除usedAthletes

    您的解决方案不起作用,因为您在每次迭代中初始化结果数组。

    const
        gameData = [{ Athlete: "Peyton Manning", Img: "url" }, { Athlete: "Tony Hawk", Img: "url" }, { Athlete: "Tom Brady", Img: "url" }, { Athlete: "Usain Bolt", Img: "url" }, { Athlete: "Kevin Durant", Img: "url" }, { Athlete: "Cristiano Ronaldo", Img: "url" }, { Athlete: "Michael Phelps", Img: "url" }, { Athlete: "Conor McGregor", Img: "url" }, { Athlete: "Phil Mickelson", Img: "url" }, { Athlete: "Stephen Curry", Img: "url" }, { Athlete: "Rory McIlroy", Img: "url" }, { Athlete: "Mike Trout", Img: "url" }, { Athlete: "Danica Patrick", Img: "url" }, { Athlete: "Drew Brees", Img: "url" }, { Athlete: "Carmelo Anthony", Img: "url" }, { Athlete: "Ryan Lochte", Img: "url" }, { Athlete: "Eli Manning", Img: "url" }, { Athlete: "Chris Paul", Img: "url" }],
        usedAthletes = ["Peyton Manning", "Tony Hawk", "Tom Brady"],
        result = gameData.filter(o => !usedAthletes.includes(o.Athlete));
          
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      const gameData = [
              {Athlete: "Peyton Manning", Img: "url"},
              {Athlete: "Tony Hawk", Img: "url"},
              {Athlete: "Tom Brady", Img: "url"},
              {Athlete: "Usain Bolt", Img: "url"},
              {Athlete: "Kevin Durant", Img: "url"},
              {Athlete: "Cristiano Ronaldo", Img: "url"},
              {Athlete: "Michael Phelps", Img: "url"},
              {Athlete: "Conor McGregor", Img: "url"},
              {Athlete: "Phil Mickelson", Img: "url"},
              {Athlete: "Stephen Curry", Img: "url"},
              {Athlete: "Rory McIlroy", Img: "url"},
              {Athlete: "Mike Trout", Img: "url"},
              {Athlete: "Danica Patrick", Img: "url"},
              {Athlete: "Drew Brees", Img: "url"},
              {Athlete: "Carmelo Anthony", Img: "url"},
              {Athlete: "Ryan Lochte", Img: "url"},
              {Athlete: "Eli Manning", Img: "url"},
              {Athlete: "Chris Paul", Img: "url"}
      ];
      
      const usedAthletes = ["Peyton Manning", "Tony Hawk", "Tom Brady"];
      
      
      var value = gameData.map((data) => {if(!usedAthletes.includes(data.Athlete)){return data;}}).filter((data) => data);
      
      console.log(value);

      【讨论】:

        【解决方案4】:

        试试这个:

        const gameData = [
                {Athlete: "Peyton Manning", Img: "url"},
                {Athlete: "Tony Hawk", Img: "url"},
                {Athlete: "Tom Brady", Img: "url"},
                {Athlete: "Usain Bolt", Img: "url"},
                {Athlete: "Kevin Durant", Img: "url"},
                {Athlete: "Cristiano Ronaldo", Img: "url"},
                {Athlete: "Michael Phelps", Img: "url"},
                {Athlete: "Conor McGregor", Img: "url"},
                {Athlete: "Phil Mickelson", Img: "url"},
                {Athlete: "Stephen Curry", Img: "url"},
                {Athlete: "Rory McIlroy", Img: "url"},
                {Athlete: "Mike Trout", Img: "url"},
                {Athlete: "Danica Patrick", Img: "url"},
                {Athlete: "Drew Brees", Img: "url"},
                {Athlete: "Carmelo Anthony", Img: "url"},
                {Athlete: "Ryan Lochte", Img: "url"},
                {Athlete: "Eli Manning", Img: "url"},
                {Athlete: "Chris Paul", Img: "url"}
        ]
        
        const usedAthletes = ["Peyton Manning", "Tony Hawk", "Tom Brady"];
        const newAnswerlist = [];
        
        gameData.forEach( data => {
          if (usedAthletes.indexOf(data.Athlete) == -1) {
            newAnswerlist.push(data.Athlete);
          }
        });

        newAnswerlist 应该包含你想要的数组。

        【讨论】:

        • 这很好用,我一直在努力解决这个问题,并且在几次尝试之前有一些看起来与此类似的东西,但我一定搞砸了。非常感谢你! :)
        • 太棒了,很高兴我能帮上忙。
        【解决方案5】:

        Lodash 的 _.differenceWith() 使用比较器创建了一个数组值数组,该数组不包含在其他给定数组中:

        const gameData = [{"Athlete":"Peyton Manning","Img":"url"},{"Athlete":"Tony Hawk","Img":"url"},{"Athlete":"Tom Brady","Img":"url"},{"Athlete":"Usain Bolt","Img":"url"},{"Athlete":"Kevin Durant","Img":"url"},{"Athlete":"Cristiano Ronaldo","Img":"url"},{"Athlete":"Michael Phelps","Img":"url"},{"Athlete":"Conor McGregor","Img":"url"},{"Athlete":"Phil Mickelson","Img":"url"},{"Athlete":"Stephen Curry","Img":"url"},{"Athlete":"Rory McIlroy","Img":"url"},{"Athlete":"Mike Trout","Img":"url"},{"Athlete":"Danica Patrick","Img":"url"},{"Athlete":"Drew Brees","Img":"url"},{"Athlete":"Carmelo Anthony","Img":"url"},{"Athlete":"Ryan Lochte","Img":"url"},{"Athlete":"Eli Manning","Img":"url"},{"Athlete":"Chris Paul","Img":"url"}];
        
        const usedAthletes = ["Peyton Manning", "Tony Hawk", "Tom Brady"];
        
        const result = _.differenceWith(gameData, usedAthletes, ({ Athlete }, othVal) => Athlete === othVal);
        
        console.log(result);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

        如果您只需要运动员姓名,可以使用_.difference() 更简单的解决方案:

        const gameData = [{"Athlete":"Peyton Manning","Img":"url"},{"Athlete":"Tony Hawk","Img":"url"},{"Athlete":"Tom Brady","Img":"url"},{"Athlete":"Usain Bolt","Img":"url"},{"Athlete":"Kevin Durant","Img":"url"},{"Athlete":"Cristiano Ronaldo","Img":"url"},{"Athlete":"Michael Phelps","Img":"url"},{"Athlete":"Conor McGregor","Img":"url"},{"Athlete":"Phil Mickelson","Img":"url"},{"Athlete":"Stephen Curry","Img":"url"},{"Athlete":"Rory McIlroy","Img":"url"},{"Athlete":"Mike Trout","Img":"url"},{"Athlete":"Danica Patrick","Img":"url"},{"Athlete":"Drew Brees","Img":"url"},{"Athlete":"Carmelo Anthony","Img":"url"},{"Athlete":"Ryan Lochte","Img":"url"},{"Athlete":"Eli Manning","Img":"url"},{"Athlete":"Chris Paul","Img":"url"}];
        
        const usedAthletes = ["Peyton Manning", "Tony Hawk", "Tom Brady"];
        
        const result = _(gameData)
          .map('Athlete')
          .difference(usedAthletes)
          .value();
        
        console.log(result);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

        【讨论】:

        • 这也有效。然后我将结果映射到一组运动员。谢谢!
        • 当你跳来跳去接受答案时 :) 我添加了一个更简单的解决方案来获取名称数组。
        • 谢谢。我只是确保查看所有答案并确保我了解每个答案的工作原理以及它们在做什么。所以我学会了如何更好地使用过滤器或 lodash 差异!
        • 这正是你应该做的——尝试和学习。看到接受标记跳来跳去真是太有趣了。
        • 哈哈是的,我没有意识到我不能说一个以上的答案有效。这不公平,每个人都工作!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多