javascript - 查找具有最大值的父对象

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

现在我需要找出谁是拥有最多衬衫的人。如何实现这一目标?

最佳答案

我将从更改您的数据结构开始。如果不进行过多的迭代,很难看出当前的格式对于迭代、聚合、获取用户名、获取项目名称等会非常有用。

这是一种更容易使用的替代数据结构,因为它没有嵌套数组,并且不需要 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);

编辑 - 我并不是对任何答案持消极态度,因为它们似乎都是从所呈现的数据结构中获取所需数据的正确且有用的方法 - 但看看有多少它们都需要迭代才能从对象中获取这些非常基本的数据。为您的数据选择正确的结构将为您省去很多麻烦。

关于javascript - 查找具有最大值的父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39992055/

相关文章:

javascript - 这个 JavaScript 模式是如何调用的以及如何以正确的方式使用它?

javascript - 从 JS 数组中删除重复项

php - 如何在 PHP 中从字符串数组创建对象

javascript - 在 vue 中作为 prop 传递的对象以字符串形式到达

JavaScript |遍历 JSON 对象并获取特定键的所有值

java - 如何将 HashMap 复制到具有不同引用的 ArrayList

javascript - 在函数/promise 范围之外使用对象

javascript - 为什么我的POST方法无法接收这个ajax?

javascript - 生成代码上带有工具栏的内联 CKEditor

arrays - 使用 Vuejs 和 Axios 合并对象