3

我有一个简单的数组:

var arr = ['has_cats', 'has_dogs'];

和一个对象:

var obj = new Object();

并从我想设置对象属性的数组中:

for( i=0; i < arr.length; i++ ) {
        if(!arr.hasOwnProperty(arr[i])) {
                // set the object property
        }
}

循环后我应该可以调用obj.has_cats,但我似乎无法在 javascript 中找到合适的方法。在 python 中,我会调用setattr(obj,arr[i], value). 我想如果对象有 ahasOwnProperty他们也应该有 agetOwnProperty和 a setOwnProperty

有什么指导吗?

4

5 回答 5

3

“我认为如果对象有 ahasOwnProperty他们也应该有 agetOwnProperty和 a setOwnProperty

hasOwnProperty()函数告诉您命名属性是否作为对象的直接属性存在,而不是作为从对象原型链中某处继承的属性。in运算符 - 使用 like -将if (someProperty in someObject) {}告诉您对象是否在原型链中的任何位置具有该属性。

您不需要相应的setOwnProperty()功能,因为您可以说:

someObject[someProperty] = someValue;

我想如果您想要一个仅在指定属性是直接属性时才返回值的函数,那么相应getOwnProperty()函数的想法是有意义的,但是没有任何方法可以指示未找到指定的属性因为如果找到该属性,null、undefined、false 等都是合法的潜在值。因此,要实现这一点,您需要使用if (hasOwnProperty()).

但这听起来不像你想要做的。如果我对您的理解正确,您只需要某种方式来设置属性名称位于变量中的属性(在您的情况下是数组元素)。您没有明确说明要将哪些值关联到这些属性,所以我将只使用true.

var arr = ['has_cats', 'has_dogs'];

var obj = {}; // note {} is generally preferred to new Object();

for(var i=0; i < arr.length; i++ ) {
  // if the property doesn't already exist directly on
  // the object
  if(!obj.hasOwnProperty(arr[i])) {
     // set the object property
     obj[arr[i]] = true;
  }
}

// can access with bracket notation
alert(obj["has_cats"]);

// can access with dot notation
alert(obj.has_cats);
于 2011-08-03T03:39:29.777 回答
2

您可以通过以下方式设置值:

for(i = 0; i < arr.length; i++ ) {
        if(!obj.hasOwnProperty(arr[i])) {
                obj[arr[i]] = 'value';
        }
}
于 2011-08-03T03:19:28.717 回答
2

既不getOwnPropertysetOwnProperty不会增加任何价值:

以下始终在从 评估的对象上设置属性x。因此,setOwnProperty无非是一个属性分配。

x[prop] = v

同样,使用hasOwnProperty和 属性存在的组合可以推导出(和取代)getOwnProperty

if (x.hasOwnProperty(prop)) {
   // x has prop
   // x[prop] may evaluate to undefined
} else if (prop in x) {
   // prop resolved through [[prototype]] chain
   // x[prop] may evaluate to undefined
} else {
   // property prop not set
   // x[prop] will evaluate to undefined
}

快乐编码。

于 2011-08-03T03:43:48.540 回答
1

我认为你有点过于复杂了。试试这个:

var arr = ['has_cats', 'has_dogs'];
var obj = new Object();
for( i=0; i < arr.length; i++ ) {
    obj[arr[i]] = true;
}

hasOwnProperty通过索引迭代数组时,您不需要对数组使用。尽管也许您打算进行检查以obj防止覆盖已经设置的任何内容?

于 2011-08-03T03:20:37.180 回答
0

您可以使用以下方式设置属性:

obj[arr[i]] = "my value";

在 javascript 中,属性访问可以通过.name或来完成['name']

于 2011-08-03T03:19:56.060 回答