Comment faire l’équivalent de LINQ SelectMany () juste en javascript

Malheureusement, je n’ai pas JQuery ou Underscore, juste du javascript (compatible avec IE9).

Je veux l’équivalent de SelectMany () de la fonctionnalité LINQ.

// SelectMany flattens it to just a list of phone numbers. IEnumerable phoneNumbers = people.SelectMany(p => p.PhoneNumbers); 

Puis-je le faire?

MODIFIER:

Grâce aux réponses, j’ai eu ce travail:

 var petOwners = [ { Name: "Higa, Sidney", Pets: ["Scruffy", "Sam"] }, { Name: "Ashkenazi, Ronen", Pets: ["Walker", "Sugar"] }, { Name: "Price, Vernette", Pets: ["Scratches", "Diesel"] }, ]; function property(key){return function(x){return x[key];}} function flatten(a,b){return a.concat(b);} var allPets = petOwners.map(property("Pets")).reduce(flatten,[]); console.log(petOwners[0].Pets[0]); console.log(allPets.length); // 6 var allPets2 = petOwners.map(function(p){ return p.Pets; }).reduce(function(a, b){ return a.concat(b); },[]); // all in one line console.log(allPets2.length); // 6 

pour une sélection simple, vous pouvez utiliser la fonction réduire de Array.
Disons que vous avez un tableau de tableaux de nombres:

 var arr = [[1,2],[3, 4]]; arr.reduce(function(a, b){ return a.concat(b); }); => [1,2,3,4] var arr = [{ name: "name1", phoneNumbers : [5551111, 5552222]},{ name: "name2",phoneNumbers : [5553333] }]; arr.map(function(p){ return p.phoneNumbers; }) .reduce(function(a, b){ return a.concat(b); }) => [5551111, 5552222, 5553333] 

Sagi a raison d’utiliser la méthode concat pour aplatir un tableau. Mais pour obtenir quelque chose de similaire à cet exemple, vous aurez également besoin d’une carte pour la partie sélectionnée https://msdn.microsoft.com/library/bb534336(v=vs.100).aspx

 /* arr is something like this from the example PetOwner[] petOwners = { new PetOwner { Name="Higa, Sidney", Pets = new List{ "Scruffy", "Sam" } }, new PetOwner { Name="Ashkenazi, Ronen", Pets = new List{ "Walker", "Sugar" } }, new PetOwner { Name="Price, Vernette", Pets = new List{ "Scratches", "Diesel" } } }; */ function property(key){return function(x){return x[key];}} function flatten(a,b){return a.concat(b);} arr.map(property("pets")).reduce(flatten,[]) 
 // you can save this function in a common js file of your project function selectMany(f){ return function (acc,b) { return acc.concat(f(b)) } } var ex1 = [{items:[1,2]},{items:[4,"asda"]}]; var ex2 = [[1,2,3],[4,5]] var ex3 = [] var ex4 = [{nodes:["1","v"]}] 

Commençons

 ex1.reduce(selectMany(x=>x.items),[]) 

=> [1, 2, 4, “asda”]

 ex2.reduce(selectMany(x=>x),[]) 

=> [1, 2, 3, 4, 5]

 ex3.reduce(selectMany(x=> "this will not be called" ),[]) 

=> []

 ex4.reduce(selectMany(x=> x.nodes ),[]) 

=> [“1”, “v”]

NOTE: utiliser un tableau valide (non null) comme valeur initiale dans la fonction réduire

Pour ceux qui sont plus tard, comprendre le javascript mais toujours vouloir une simple méthode SelectMany typée dans Typescript:

 function selectMany(input: TIn[], selectListFn: (t: TIn) => TOut[]): TOut[] { return input.reduce((out, inx) => { out.push(...selectListFn(inx)); return out; }, new Array()); }