我有一个对象数组,每个对象包含其他对象'。我需要返回质量最大的子对象'属性。
以下代码会注销所有子对象。我如何只返回质量最高的那个?
var maxQuality = function(Arr) {
Arr.forEach(function(obj, index) {
Math.max.apply(Math, obj.products.map(function(subObj) {
console.log(subObj);
}))
});
},
store = [
{
products: [
{
quality: 1,
info: 'info 1'
},
{
quality: 2,
info: 'info 2'
},
{
quality: 3,
info: 'info 3'
}
]
}
],
maxQualityProduct = maxQuality(store);

答案 0 :(得分:2)
您可以使用阵列上的reduce()
方法
var products = [
{
quality: 1,
info: 'info 1'
},
{
quality: 2,
info: 'info 2'
},
{
quality: 3,
info: 'info 3'
}
];
var highest = products.reduce(function(prev, current) {
return prev.quality > current.quality ? prev : current
}, {});
console.log(highest);

请注意,reduce
需要两个参数 - 一个是回调,第二个是您从名为 seed 开始的初始项。在这种情况下,因为我们只检查一个平面值,所以空对象的种子将正常工作,因为当从它获取属性quality
时它将返回undefined
并且将小于任何其他产品但是,对于更复杂的结构或比较,您可能需要将数组中的实际项目作为种子。
答案 1 :(得分:1)
虽然另一个.reduce
答案可能会为您提供所需内容,但如果商店阵列包含多个对象 - 不确定这是否是您想要/需要的东西 - 您可以使用:
var maxQuality = function(storeArray) {
function highestQuality(prev, curr) {
return prev.quality > curr.quality ? prev : curr
}
return storeArray.map(function(obj) {
return obj.products.reduce(highestQuality)
}).reduce(highestQuality);
}
答案 2 :(得分:0)
我想这归结为一种简单的Array.prototype.sort
类:
products.sort(( a, b ) => b.quality - a.quality )[ 0 ];
答案 3 :(得分:0)
您可以使用以下代码段:
var maxQuality = function(Arr) {
var result = undefined;
for (var obj of store) {
for (var product of obj.products) {
if (!result || product.quality > result.quality) {
result = product;
}
}
}
return result;
},
store = [
{
products: [
{
quality: 1,
info: 'info 1'
},
{
quality: 2,
info: 'info 2'
},
{
quality: 3,
info: 'info 3'
}
]
}
],
maxQualityProduct = maxQuality(store);
console.log(maxQualityProduct);