对于jscript对象中的in循环显示为文本

时间:2016-11-29 08:53:30

标签: javascript arrays javascript-objects

        var Product = {
            name : 'Soap',
            brand : 'Dove',
            price : 25.50,
            discountRate : 5,
            quantitySold: [10,5,25,8,4],
            netPrice:function(){return this.price * (100 - this.discountRate) / 100;},
            averageSales:function(){
                for(var sum in this.quantitySold){
                    var i = 0;
                    i++
                    sum += this.quantitySold[i];
                }
                return sum
            }
        }

代码应该添加数组中的值(quantitySold)然后平均它们,但我似乎无法显示for循环,当你运行代码时它只显示为文本

5 个答案:

答案 0 :(得分:2)

您需要在数组中添加所有数字,然后将它们除以数组的长度。 Array#reduce是循环和求和数据的好方法:



var Product = {
  name: 'Soap',
  brand: 'Dove',
  price: 25.50,
  discountRate: 5,
  quantitySold: [10, 5, 25, 8, 4],
  netPrice: function() {
    return this.price * (100 - this.discountRate) / 100;
  },
  averageSales: function() {
    return this.quantitySold.length && this.quantitySold.reduce(function(sum, num) {
      return sum + num;
    }) / this.quantitySold.length;
  }
}

console.log(Product.averageSales());




如果您希望使用简单的循环,请使用简单的for loop



var Product = {
  name: 'Soap',
  brand: 'Dove',
  price: 25.50,
  discountRate: 5,
  quantitySold: [10, 5, 25, 8, 4],
  netPrice: function() {
    return this.price * (100 - this.discountRate) / 100;
  },
  averageSales: function() {
    var sum = 0;
    for (var i = 0; i < this.quantitySold.length; i++) {
      sum += this.quantitySold[i];
    }

    return sum / this.quantitySold.length;
  }
}

console.log(Product.averageSales());
&#13;
&#13;
&#13;

为什么代码的结果是&#34; 45&#34;?

当您使用for in时,sum变量包含属性键字符串(索引),并且在收到新索引时会丢弃所有内容。此外,在每个循环上,您将i重置为0,并将其递增1,因此i有效地始终为1.当它到达最后一次迭代时sum"4" ,索引1中的数字是5 =&gt; "4" + 5 === "45",这就是你得到的结果。

答案 1 :(得分:0)

试试这个:

var Product = {
            name : 'Soap',
            brand : 'Dove',
            price : 25.50,
            discountRate : 5,
            quantitySold: [10,5,25,8,4],
            netPrice:function(){return this.price * (100 - this.discountRate) / 100;},
            averageSales:function(){
                var sum = 0;
                for(var i in this.quantitySold){
                    sum += this.quantitySold[i];
                }
                return (sum / this.quantitySold.length);
            }
        }

答案 2 :(得分:0)

您不应将for..in循环与应该用于object的数组一起使用。您可以使用常规for循环,如下所示。

&#13;
&#13;
var Product = {
                name : 'Soap',
                brand : 'Dove',
                price : 25.50,
                discountRate : 5,
                quantitySold: [10,5,25,8,4],
                netPrice: function(){ return this.price * (100 - this.discountRate) / 100; },
                averageSales: function(){
                    var sum = 0;
                    for(var i = 0; i < this.quantitySold.length; i++){
                        sum += this.quantitySold[i];
                    }
                    return sum / this.quantitySold.length;
                }
            };

console.log(Product.averageSales());
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我认为... in将sum值设置为this.quantitySold属性名称,但是执行所需循环的等效方法是声明for ... of(for for。 ..每个在ES4中)迭代集合。当然,您应该在一个地方声明sum初始化0,其价值不会受到影响。由于我们将要使用...因为语法,我们只能在其parens之外声明sum。如果我们可以在里面声明它是常见的:for (var ..., sum = 0;;)

sum = 0;

for (let quantity of this.quantitySold)
    sum += quantity;

var sum;
return sum;

答案 4 :(得分:0)

var Product = {
    name : 'Soap',
    brand : 'Dove',
    price : 25.50,
    discountRate : 5,
    quantitySold: [10, 5, 25, 8, 4],
    netPrice: function(){ 
        return this.price * (100 - this.discountRate) / 100;
    },
    findAverage: function() {
    // create a var for the quantitySold Array
    var quantity = Product.quantitySold;

    // find the sum of each item in the Array using reduce
    var sum = quantity.reduce(function(a, b) {
        return (a + b);
    });

    // take the average of the sum divided by the number of items in the Array
    return avg = sum / quantity.length;
  }
}

// Run the function to return the avg
Product.findAverage();

创建一个将对象作为第一个参数的函数和一个运行此findAverage代码作为第二个参数的函数也会更好。这样你就可以在任何对象上运行它,以便它可以重复使用。