2016-10-12 4 views
0

私はjavascriptを使い慣れていないので、この質問は非常に基本的に聞こえるかもしれません。最大値の親オブジェクトを見つける

var data = [ 
{ Amy: {items:[{shirt: 12},{trouser: 10}] } }, 
{ Bill: {items:[{shirt: 10},{trouser: 11}] } }, 
{ Chet: {items:[{shirt: 11},{trouser: 12}] } } 
]; 

私は、最大数のシャツを持っている人を返す関数を作成しようとしています。だから私はこのような2つの関数を最初に最大値を取得するには

var shirtValues = data.map(function(obj) {return obj.items[shirts]; }); 
    var maxValue = Math.max.apply(null, shirtValues); 
    console.log(maxValue); 

今私はシャツの最大数を持っている人を見つける必要があります。それを達成する方法?

+1

とmaxを持つ2つの以上の項目を持ちますか?どちらを手に入れたいですか? –

+0

underscore.js libのようなライブラリを使いたい場合は、指定されたオブジェクトや配列から必要なものを簡単に取得できます。 – KnowGe

+0

@Nina Scolz:いずれか。シャツ、ズボン、またはその両方。 –

答えて

2

私はあなたのデータ構造を変更することで開始します。過度の反復をせずに、現在の書式が反復、集約、ユーザーの名前の取得、項目の名前の取得などに過度に役立つかどうかを確認するのは難しいです。

var data = [{ 
    user: 'Amy', 
    items: { 
    shirt: 12, 
    trouser: 10 
    } 
}, { 
    user: 'Bill', 
    items: { 
    shirt: 10, 
    trouser: 11 
    } 
}, { 
    user: 'Chet', 
    items: { 
    shirt: 11, 
    trouser: 12 
    } 
}]; 

:ここ

は、ネストされた配列を持っていないためで作業する方がはるかに簡単です、あなたが一貫して必要なデータ(例えばユーザー名)にアクセスする Object.keysを必要としない一つの代替データ構造であり、このフォーマットを使用すると、簡単に並べ替え、特定の数量によってできます

let getTopItem = (data, itemName) => { 
    // 1. clone the array using concat 
    // 2. sort by value at supplied itemName 
    // 3. return the first item 
    let sorted = data.concat().sort((a, b) => { 
    return b.items[itemName] - a.items[itemName]; 
    }); 
    return sorted.shift(); 
} 

let topShirts = getTopItem(data, 'shirt'); 
console.log(topShirts.user); 

EDIT - それらはすべて正しいと便利approacように見えるように私は否定的回答のいずれかの方にこのことを意味するものではありません。提示されたデータ構造から必要なデータを取得することになりますが、この基本データをオブジェクトから取り出すために必要な繰り返しの数を見てください。データに適した構造を選択することで、多くの頭痛を軽減できます。あなたのデータ構造を変更することはできません、と仮定する

0

JSON構造体が常にこの場合。そして、あなたが見つけるにこの方法を使用することができる最大のシャツはカウント:最大ズボンのための

var max=0; 
var maxShirtCount=null; 
data.forEach(function(ele,ind){ 
    currVal = ele[Object.keys(ele)[0]].items[0].shirt; 
    if(currVal>max){ 
    max=currVal; 
    maxShirtCount=ele; 
    } 
}); 
console.log(maxShirtCount); 

カウント:

var max=0; 
var maxTrouserCount=null; 
data.forEach(function(ele,ind){ 
    currVal = ele[Object.keys(ele)[0]].items[1].trouser; 
    if(currVal>max){ 
    max=currVal; 
    maxTrouserCount=ele; 
    } 
}); 
console.log(maxTrouserCount); 
0

あなたはnameとして、キーを取得することができ、希望の項目の取得前の人の数と比較して比較する。 maxが同じ場合は、結果配列を拡張し、大きい場合はmaxデータで新しいオブジェクトを返します。

function getMax(item) { 
 
    return data.reduce(function (r, a) { 
 
     var name = Object.keys(a)[0], 
 
      count = a[name].items.reduce(function (s, b) { 
 
       return s + (b[item] || 0); 
 
      }, 0); 
 

 
     if (count >= r.count) { 
 
      if (count > r.count) { 
 
       return { item: item, names: [name], count: count }; 
 
      } 
 
      r.names.push(name); 
 
     } 
 
     return r; 
 
    }, { item: item, names: [], count: 0 }); 
 
} 
 

 
var data = [{ Amy: { items: [{ shirt: 12 }, { trouser: 10 }] } }, { Bill: { items: [{ shirt: 10 }, { trouser: 11 }] } }, { Chet: { items: [{ shirt: 11 }, { trouser: 12 }] } }], 
 
    maxShirt = getMax('shirt'); 
 

 
console.log(maxShirt);  // all names with max count 
 
console.log(maxShirt.names); // just the names

0
var data = [ 
{ Amy: {items:[{shirt: 12},{trouser: 10}] } }, 
{ Bill: {items:[{shirt: 10},{trouser: 11}] } }, 
{ Chet: {items:[{shirt: 11},{trouser: 12}] } } 
]; 

function doSort(a, b){ 
    return a[Object.keys(a)].items[0].shirt < b[Object.keys(b)].items[0].shirt; 
} 

console.log(Object.keys(data.sort(doSort)[0])[0]); 
1

reduce機能は、あなたの目的を果たすために非常に便利です。実際には、ロジックはかなり簡単になります!このことができます

var data = [ 
 
    { Amy: {items:[{shirt: 12},{trouser: 10}] } }, 
 
    { Bill: {items:[{shirt: 10},{trouser: 11}] } }, 
 
    { Chet: {items:[{shirt: 11},{trouser: 12}] } } 
 
    ]; 
 

 
    var new_data = data.reduce(function(max, obj) { 
 
    \t var obj_val; 
 
    \t var max_val; 
 
    
 
    \t max_val = get_shirt_val(max); 
 
\t  obj_val = get_shirt_val(obj); 
 
    
 
\t  return obj_val > max_val ? obj : max; 
 
    }); 
 

 
    function get_shirt_val(obj) { 
 
     key = Object.keys(obj)[0] 
 
    \t \t return obj[key].items[0].shirt; 
 
    } 
 

 
    console.log(JSON.stringify(new_data)); 
 
    console.log(Object.keys(new_data)[0])

希望:コードが下方に設けられています!

0

ソートを行わず、シングルパスを減らすと、次のようになる可能性があります。

var data = [{ Amy: {items:[{shirt: 12},{trouser: 10}] } }, { Bill: {items:[{shirt: 10},{trouser: 11}] } }, { Chet: {items:[{shirt: 11},{trouser: 12}] } } 
 
], 
 
    result = data.reduce((p,c) => { var sc = c[Object.keys(c)[0]].items[0].shirt; 
 
            return sc > p[0] ? [sc,c] : p; 
 
           },[0,{}])[1]; 
 
console.log(result);

関連する問題