残念ながら、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);