我的 for 循环只输出最后一个结果,我可以更改吗?



所以我试图更多地了解循环,但我想知道是否有办法返回循环的每次迭代而不仅仅是最终结果?

我知道我可以单独列出项目,但我想找出一种方法,我可以更有效地做到这一点,以防数组中有大量对象。

function average(array) {
for (i=0;i<array.length;i++){
return array[i]['number']/array.length
}
}
const array = [
{ user: 'a', number: 20 },
{ user: 'b', number: 21 },
{ user: 'c', number: 22 }
];

你不能从一个普通函数返回,当你发出return时,这个函数会立即脱离循环;除非你使用生成器函数,用function关键字后跟星号表示,即function*语法。

这是根据您的要求,即您不希望列出这些项目:

我知道我可以单独列出这些项目,但我想弄清楚 找到一种我可以更有效地做到这一点的方法

因此,在生成器函数的情况下,yield value实际上返回一个value并暂停正在运行的函数的执行,并且不会脱离循环:

const array = [
{ user: 'a', number: 20 },
{ user: 'b', number: 21 },
{ user: 'c', number: 22 }
];
function* average(array) {
for (i=0;i<array.length;i++){
yield array[i].number / array.length
}
}
const avgGen = average(array);
// "..." spread operator gets all values from the iterable avgGen
console.log(...avgGen);

您还可以使用for-of循环逐个迭代值,因为生成器函数调用返回iterable对象:

const array = [
{ user: 'a', number: 20 },
{ user: 'b', number: 21 },
{ user: 'c', number: 22 }
];
function* average(array) {
for (i=0;i<array.length;i++){
yield array[i].number / array.length
}
}
let avgValue = average(array);
for(val of avgValue){
console.log(val);
}

对于普通函数,当您发出返回时,循环将中止,即时值将返回给调用方:

const array = [
{ user: 'a', number: 20 },
{ user: 'b', number: 21 },
{ user: 'c', number: 22 }
];
function average(array) { //no asterisk
for (i=0;i<array.length;i++){
//loop is terminated with the first calculation or the first value
return array[i].number / array.length 
}
}
const avgGen = average(array); //one value is expected
console.log(avgGen);

另一方面,生成器函数将暂时暂停yield语句中的循环执行并生成/返回一个对象,如{value: value, done: boolean}。请注意,当您执行生成器函数时,它不会立即执行代码,它会返回一个iterable,即具有next()方法并且可以迭代的对象。

在返回的iterable上调用next()时,将获得第一个值。可迭代对象会不断向您返回值,直到循环耗尽。

function* gen(){ //Note the asterisk
yield 1; //pauses after each next() call
yield 2;
yield 3;
return "completed";
}
const iterable = gen();// returns a iterable
const one = iterable.next();// get the first value {value: value, done: boolean}
console.log(one.value);
const two = iterable.next(); //loop resumed till yield 3
console.log(two.value);
const three = iterable.next();
console.log(three.value); //all values yielded
const final = iterable.next();
console.log(final.value); // value of the return statement
console.log(final.done); //done is true

要返回每个值,您可以使用一个额外的results数组,该数组使用push()填充:

function average(array) {
var results = [];
for (i = 0; i < array.length; i++) {
results.push(array[i]['number'] / array.length);
}
return results;
}
const array = [
{ user: 'a', number: 20 },
{ user: 'b', number: 21 },
{ user: 'c', number: 22 }
];
console.log(average(array));

或者更高级:你可以调用map(),它将处理所有项目并为每个项目返回一个派生值:

function average(array) {
return array.map(item => item.number / array.length);
}
const array = [
{ user: 'a', number: 20 },
{ user: 'b', number: 21 },
{ user: 'c', number: 22 }
];
console.log(average(array));

据我所知,最直接的方法就是使用JavaScript的reduce

const average = array.reduce((sum, obj) => { return sum + obj.number;}, 0 ) / array.length;

如果您不想使用reduce并且更容易阅读:

let sum = 0;
array.forEach(obj => { sum += obj.number });
const average = sum / array.length;

相关内容

最新更新