代码之家  ›  专栏  ›  技术社区  ›  Eric Hepperle - CodeSlayer2010

使用ES6在没有贴图的情况下增加对象属性

  •  0
  • Eric Hepperle - CodeSlayer2010  · 技术社区  · 6 年前

    问题

    我不是一个真正的初学者,但这可能是一个初学者的问题。我试图增加ES6 JavaScript对象的count属性。这个最小代码示例的两个最成功的版本(例如,它们提供了错误的信息,但没有错误)为每个水果的count属性返回“NaN”或“1”。这似乎应该可行,但显然递增数字对象属性并不是一个直观的概念。

    所以,我想做的是:

    创建水果对象作为键,以及它们出现的次数。结束对象如下所示:

    fruitsObj[fruit].name
    fruitsObj[fruit].count
    

    所以对于“苹果”:

    fruitsObj.apple.name // apple
    fruitsObj.apple.count // 4
    

    但是,我收到的输出是:

    {apple: {…}, pear: {…}, banana: {…}, orange: {…}, kumquat: {…}}
    apple:{name: "apple", count: NaN}
    banana:{name: "banana", count: NaN}
    kumquat:{name: "kumquat", count: NaN}
    orange:{name: "orange", count: NaN}
    pear:{name: "pear", count: NaN}
    __proto__: Object
    

    在版本2中,我尝试了存在性和类型检查,但没有成功。每次计数的唯一值为“1”:

    {apple: {…}, pear: {…}, banana: {…}, orange: {…}, kumquat: {…}}
    apple:{name: "apple", count: 1}
    banana:{name: "banana", count: 1}
    kumquat:{name: "kumquat", count: 1}
    orange:{name: "orange", count: 1}
    pear:{name: "pear", count: 1}
    __proto__: Object
    

    我不确定我在这里做错了什么。

    我的代码

    版本1:

    // Declare an array of fruits
    var fruitsArr = ['apple', 'pear', 'apple', 'banana', 'orange', 'kumquat', 'orange', 'apple', 'apple', 'orange'];
    
    var fruitsObj = {};
    
    // Loop through each fruit storing name and count.
    fruitsArr.forEach(function(fruit, i) {
    	
    	// Create each named-fruit property in object as a sub-object.
    	fruitsObj[fruit] = {};
    	
    	fruitsObj[fruit].name = fruit;
    	
    	// FAILS with NaN!
    	fruitsObj[fruit].count = ++fruitsObj[fruit].count;
    	
    });
    
    console.log(fruitsObj);

    版本2:

    // Declare an array of fruits
    var fruitsArr = ['apple', 'pear', 'apple', 'banana', 'orange', 'kumquat', 'orange', 'apple', 'apple', 'orange'];
    
    var fruitsObj = {};
    
    // Loop through each fruit storing name and count.
    fruitsArr.forEach(function(fruit, i) {
    	
    	// Create each named-fruit property in object as a sub-object.
    	fruitsObj[fruit] = {};
    	
    	fruitsObj[fruit].name = fruit;
    
    	// if fruit count exists and is greater than zero
    	if (fruitsObj[fruit].count != undefined && fruitsObj[fruit].count > 0) {
    		// increment it
    		fruitsObj[fruit].count++;
    	} else {
    		// set it to one
    		fruitsObj[fruit].count = 1;
    	}	
    	
    });
    
    console.log(fruitsObj);

    我咨询的链接

    我回顾了一堆让我陷入困境的帖子和链接。尽管如此,他们中没有一个明确地解决了我的问题,我可以说。

    我的问题

    1. 为什么我的计数器不递增,而是返回“NaN”?
    2. 在赋值之前,是否有特殊的方法将对象属性声明为数字?
    3. 在我的理解中,我遗漏了什么来完成这项工作?如何增加对象计数属性?
    3 回复  |  直到 6 年前
        1
  •  3
  •   Prakash Sharma    6 年前

    为什么我的计数器不递增,而是返回“NaN”?

    因为您试图在第一种情况下增加未定义的属性。直列式

    fruitsObj[fruit].count = ++fruitsObj[fruit].count;
    

    fruitsObj[fruit].count 未定义,因为您从未为其指定任何数值。您在第二个代码块中更正了此问题。

    在我的理解中,我遗漏了什么来完成这项工作?我怎么能 增加我的对象计数属性?

    第二个代码的问题是这一行

    // Create each named-fruit property in object as a sub-object.
        fruitsObj[fruit] = {};
    

    您正在每次迭代中指定一个新对象。因此,即使此结果是第二次出现,在指定新对象时,新对象也会覆盖以前的值。您可以通过检查此对象是否已存在或与此不同来消除此问题

    // Declare an array of fruits
        var fruitsArr = ['apple', 'pear', 'apple', 'banana', 'orange', 'kumquat', 'orange', 'apple', 'apple', 'orange'];
        
        var fruitsObj = {};
        
        // Loop through each fruit storing name and count.
        fruitsArr.forEach(function(fruit, i) {
        	
        	// Create a fruit object only if it does not exist already.
            if (!fruitsObj[fruit]) {
        	   fruitsObj[fruit] = {};
            }
        	
        	fruitsObj[fruit].name = fruit;
        
        	// if fruit count exists and is greater than zero
        	if (fruitsObj[fruit].count != undefined && fruitsObj[fruit].count > 0) 
            {
        		// increment it
        		fruitsObj[fruit].count++;
        	} else {
        		// set it to one
        		fruitsObj[fruit].count = 1;
        	}	
        	
        });
        
        console.log(fruitsObj);
        2
  •  3
  •   Ori Drori    6 年前

    使用初始化水果的对象 count: 0 ,当它不存在时,然后将每个同名水果的计数增加1:

    // Declare an array of fruits
    var fruitsArr = ['apple', 'pear', 'apple', 'banana', 'orange', 'kumquat', 'orange', 'apple', 'apple', 'orange'];
    
    var fruitsObj = {};
    
    // Loop through each fruit storing name and count.
    fruitsArr.forEach(function(fruit) {
      // if the object lacks a [fruit] property
      if(!fruitsObj[fruit]) {
        // create a new [fruit] object, with the name and count: 0
        fruitsObj[fruit] = { 
          name: fruit,
          count: 0
        };
      }
    	
      // increment the count of the [fruit] object
      fruitsObj[fruit].count++;
    });
    
    console.log(fruitsObj);
        3
  •  1
  •   Alexander    6 年前

    在forEach循环中,仅尝试以下两行:

    if(fruitObj[fruit]) fruitObj[fruit].count+=1;
    else fruitObj[fruit] = {name: fruit, count: 1};
    

    这是实例化还是递增,取决于之前的实例化。不能递增未统计的值,在第二个版本中,每次都(无条件)实例化新的空对象。