2017-08-01 185 views
0

我有一个gameData和使用过的运动员的列表。我需要创建一个只包含gameData中不在usedAthletes中的Athlete的新数组。在过去的一天左右,我老实地看了过去,尝试了许多东西。任何建议将是伟大的。如果有工作,这将是冷静地知道,太:)通过比较阵列对象与阵列来创建新阵列

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) 
}) 

回答

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); 
+0

我试过这个,但是当我控制台登录newAnswerlist时,它返回一个空数组。 – SirFry

+0

@SirFry“Athelete”中有一个错字,使它成为'运动员' – pratZ

+0

lul我也错过了,现在对不起。谢谢您的帮助! – SirFry

1

你可以使用Array#filterArray#includes和排除usedAthletes 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" }], 
 
    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; }

1

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>

+0

这也适用。然后我将结果映射到一系列运动员。谢谢! – SirFry

+1

虽然你在接受答案跳来跳去:)我已经添加了一个更简单的解决方案来获取一个名称数组。 –

+0

谢谢。我只是要确保查看所有答案,并确保我明白为什么每个答案都有效,他们在做什么。所以我学会了如何更好地使用过滤器或lodash区别的东西! – SirFry

1

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);

2

试试这个:

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应该包含你想要的阵列。

+0

这个效果很好,我一直在打我的头,并且有几次尝试之前看起来类似于这个,但我一定会搞砸了。非常感谢你! :) – SirFry

+0

真棒,很高兴我可以帮助。 –