查找具有最大值的父对象

时间:2016-10-12 06:41:50

标签: javascript arrays object ecmascript-6

我是javascript的新手,所以这个问题听起来很基本。

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

我正在尝试编写一个函数来返回谁拥有最大数量的衬衫。所以我写了两个这样的函数来获得最大值

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

现在我需要找到谁是最大数量的衬衫。如何实现?

6 个答案:

答案 0 :(得分:2)

我首先要改变你的数据结构。很难看出当前格式对于迭代,聚合,获取用户名称,获取项目名称等过于有用,而无需过多迭代。

这是一个更容易使用的替代数据结构,因为它没有嵌套数组,并且不需要Object.keys来访问您需要的数据(例如用户名):

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

使用此格式,您可以轻松按特定商品数量排序:

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

编辑 - 我并不是对任何答案都有负面意义,因为它们似乎都是正确且有用的方法,可以从呈现的数据结构中获取所需的数据 - 但请看一下它们都需要多少次迭代才能从对象中获取这些非常基本的数据。为您的数据选择正确的结构将为您节省许多麻烦。

答案 1 :(得分: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) {
    	var obj_val;
    	var max_val;
 
    	max_val = get_shirt_val(max);
	    obj_val = get_shirt_val(obj);
  
	    return obj_val > max_val ? obj : max;
    });

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

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

希望这有帮助!

答案 2 :(得分: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);

答案 3 :(得分:0)

您可以获取密钥,如name,获取所需项目的计数,并与之前人员的计数进行比较。如果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




答案 4 :(得分: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]);

答案 5 :(得分:0)

如果没有排序并且单次传递减少,您可以执行以下操作;

&#13;
&#13;
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);
&#13;
&#13;
&#13;