所以我想更多地了解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 }
];
答案 0 :(得分:2)
您不能从正常函数返回,后者会在发出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);
}
对于普通函数,当您发出return时,循环中止并且立即值返回给调用者:
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()
方法并且可以迭代的对象。
在返回的next()
上调用iterable
时,将获得第一个值。迭代器不断向您返回值,直到循环用完为止。
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
答案 1 :(得分:0)
要返回每个值,可以使用在使用时使用 push()
填充的其他 results
数组:
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));
答案 2 :(得分:0)
据我所知,最直接的方法是使用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;