查找具有最大值的父对象
Find parent object with max value
我是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);
EDIT—我并不是说这对任何答案都是负面的,因为它们似乎都是从所呈现的数据结构中获取所需数据的正确和有用的方法—但是看看它们都需要多少次迭代才能从您的对象中获取这些非常基本的数据。为数据选择正确的结构将为您省去很多麻烦。
如果不能更改数据结构,则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])
希望这对你有帮助!
如果您的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);
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]);
您可以获取键,如name
,获取所需项目的计数,并与先前人员的计数进行比较。如果max相同,则扩展结果数组,如果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
如果不进行排序并使用单遍缩减,您可以执行以下操作;
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);
相关文章:
- 获取整数对象属性名称的最小值和最大值
- 返回javascript对象中的最大值
- 正在查找对象集合的最大值
- JavaScript/Andercore获取对象中所有项的最小-最大值
- 如何获取数组中包含最大值的两个对象
- 数组中的最大值(值是数组对象中的属性)
- 快速获取对象属性中的最小/最大值
- 在带有对象的数组中查找最小值、最大值
- 如何确定 JSON 对象数组中特定字段的最大值
- 从 JavaScript 数组中获取对象值的最大值和最小值
- 如何修复对象自动重新排序最小值到最大值(在)循环中
- 如何在Javascript中的复杂对象数组中找到最小/最大值
- 比较 JavaScript 对象数组以获得最小值/最大值
- 查找子对象的最大值
- 从带有下划线的对象数组中获取最小值和最大值
- 使用javascript从JSON对象中获取最大值
- 我怎样才能得到一个对象中指定键的最大值?
- 查找具有最大值的父对象
- 如何从对象数组中获得最大值,以便在d3.scale.linear().domain()中使用
- 如何使用JavaScript或jQuery在多维JSON对象中找到特定节点的最大值?