LINQ SelectMany() と同等のことを JavaScript で行う方法 質問する

LINQ SelectMany() と同等のことを JavaScript で行う方法 質問する

残念ながら、JQuery や Underscore はなく、純粋な JavaScript (IE9 互換) のみです。

LINQ 機能から SelectMany() と同等のものを求めています。

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

できますか?

編集:

回答のおかげで、これが機能するようになりました:

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

ベストアンサー1

単純な選択には、Array の Reduce 関数を使用できます。
数値の配列の配列があるとします。

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]

編集:
es6 以降、flatMap が Array プロトタイプに追加されました。SelectManyは と同義ですflatMap
このメソッドは、まずマッピング関数を使用して各要素をマップし、次に結果を新しい配列にフラット化します。TypeScript での簡略化されたシグネチャは次のとおりです。

function flatMap<A, B>(f: (value: A) => B[]): B[]

このタスクを達成するには、各要素をphoneNumbersにflatMapするだけです。

arr.flatMap(a => a.phoneNumbers);

おすすめ記事