如何计算数组内嵌套对象内的一组数字的平均值?



我有以下对象,每个形状都有一组颜色:

const design = {
designId: 1,
shapes: [
{ shapeId: 'basic-square', color: { r: 255, g: 255, b: 255 }},
{ shapeId: 'basic-circle', color: { r: 255, g: 255, b: 255 }},
{ shapeId: 'basic-diamond', color: { r: 255, g: 0, b: 0 }},
{ shapeId: 'basic-rectangle', color: { r: 0, g: 255, b: 0 }}
]
}

我想返回以下输出,计算每个设计对象的每种颜色的平均值:

设计1:{b g r: 191.25: 191.25: 127.5}

记住大O,解决这个问题的有效方法是什么?

这是我的尝试,但是我被告知效率不够:

const average = (arr) => arr.reduce((a, b) => a + b, 0) / arr.length;
const { shapes } = design;
const reds = shapes.map(shape => shape.color.r)
const greens = shapes.map(shape => shape.color.g)
const blues = shapes.map(shape => shape.color.b)
console.log(`Design ${design.designId}: {r: ${average(reds)}, g: ${average(greens)}, b: ${average(blues)} }`)

你的解是0 (6N)所以是0 (N)不过,我还是会使用reduce。

const design = {
designId: 1,
shapes: [
{ shapeId: 'basic-square', color: { r: 255, g: 255, b: 255 }},
{ shapeId: 'basic-circle', color: { r: 255, g: 255, b: 255 }},
{ shapeId: 'basic-diamond', color: { r: 255, g: 0, b: 0 }},
{ shapeId: 'basic-rectangle', color: { r: 0, g: 255, b: 0 }}
]
};
const { shapes, designId  } = design;
const average = shapes.reduce((acc, curr) => ({
red: acc.red + curr.color.r / shapes.length,
green: acc.green + curr.color.g / shapes.length,
blue: acc.blue + curr.color.b / shapes.length
}), {
red: 0, green: 0, blue: 0
}
);

console.log(`Design ${designId}: {r: ${average.red}, g: ${average.green}, b: ${average.blue}`)

您的尝试是O(6n)(这是出于所有意图和目的O(n)),但您可以在单个reduce()调用或for循环中以O(1n)完成。

const design = {
designId: 1,
shapes: [
{ shapeId: 'basic-square', color: { r: 255, g: 255, b: 255 } },
{ shapeId: 'basic-circle', color: { r: 255, g: 255, b: 255 } },
{ shapeId: 'basic-diamond', color: { r: 255, g: 0, b: 0 } },
{ shapeId: 'basic-rectangle', color: { r: 0, g: 255, b: 0 } }
]
}
const sums = { r: 0, g: 0, b: 0 };
for (const { color: { r, g, b } } of design.shapes) {
sums.r += r
sums.g += g;
sums.b += b;
}
const len = design.shapes.length;
const result = {
[`Design ${design.designId}`]: {
r: sums.r / len,
g: sums.g / len,
b: sums.b / len
}
}
console.log(result);

使用for循环将Array.map()部分移动到average()函数

const design = {
designId: 1,
shapes: [
{ shapeId: 'basic-square', color: { r: 255, g: 255, b: 255 }},
{ shapeId: 'basic-circle', color: { r: 255, g: 255, b: 255 }},
{ shapeId: 'basic-diamond', color: { r: 255, g: 0, b: 0 }},
{ shapeId: 'basic-rectangle', color: { r: 0, g: 255, b: 0 }}
]
};
//Design 1: {r: 191.25, g: 191.25, b: 127.5 }
function average(color) {
let result = 0;
for(let i=0; i<design.shapes.length; i++) {
result += design.shapes[i].color[color]
}
return result / design.shapes.length;
}
console.log(`Design ${design.designId}: {r: ${average('r')}, g: ${average('g')}, b: ${average('b')} }`)

最新更新