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

时间:2019-08-19 09:17:55

标签: javascript arrays for-loop

所以我想更多地了解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 }
];

3 个答案:

答案 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;