102

オブジェクトがあるとします:

var obj = {
  foo:"bar",
  fizz:"buzz"
};

次のように、そのオブジェクトのプロパティに動的にアクセスする必要があります。

var objSetter = function(prop,val){
  obj[prop] = val;
}

プロパティ名が の代わりにprop関数に渡される場合に大文字と小文字を区別する必要があることを除いて、問題はありません。Foofoo

では、大文字と小文字を区別せずに名前でオブジェクトのプロパティを指定するにはどうすればよいでしょうか? 可能であれば、オブジェクト全体を反復することは避けたいと思います。

4

17 に答える 17

29

obj のすべてのプロパティを prop と比較します。

var objSetter = function(prop,val){
  prop = (prop + "").toLowerCase();
  for(var p in obj){
     if(obj.hasOwnProperty(p) && prop == (p+ "").toLowerCase()){
           obj[p] = val;
           break;
      }
   }
}
于 2012-09-18T20:30:53.577 に答える
12

このため、使いやすさと表現力のために、スタンドアロン関数よりもプロトタイプを使用することを好みます。必要がなければ、オブジェクトを関数に注ぎ込むのは好きではありません。

また、受け入れられた回答は機能しますが、ネイティブのドット表記またはブラケット表記とできるだけ同じように動作する、取得と設定の両方のためのより包括的なソリューションが必要でした。

そのことを念頭に置いて、大文字と小文字を区別せずにオブジェクト プロパティを設定/取得するためのプロトタイプ関数をいくつか作成しました。Object プロトタイプに追加するときは、非常に責任があることを覚えておく必要があります。特に JQuery やその他のライブラリを使用する場合。enumerable を false に設定した Object.defineProperty() は、特に JQuery との競合を回避するために使用されていました。また、関数に大文字と小文字を区別しないことを示すような名前を付けることも気にしませんでしたが、確かに可能です。私は短い名前が好きです。

ゲッターは次のとおりです。

Object.defineProperty(Object.prototype, "getProp", {
    value: function (prop) {
        var key,self = this;
        for (key in self) {
            if (key.toLowerCase() == prop.toLowerCase()) {
                return self[key];
            }
        }
    },
    //this keeps jquery happy
    enumerable: false
});

セッターは次のとおりです。

Object.defineProperty(Object.prototype, "setProp", {
    value: function (prop, val) {
        var key,self = this;
        var found = false;
        if (Object.keys(self).length > 0) {
            for (key in self) {
                if (key.toLowerCase() == prop.toLowerCase()) {
                    //set existing property
                    found = true;                        
                    self[key] = val;
                    break;
                }
            }
        }

        if (!found) {
            //if the property was not found, create it
            self[prop] = val;
        }  

        return val;
    },
    //this keeps jquery happy
    enumerable: false
});

これらの関数を作成したので、コードは非常にクリーンで簡潔になり、機能します。

大文字と小文字を区別しない取得:

var obj = {foo: 'bar', camelCase: 'humpy'}

obj.getProp("FOO");          //returns 'bar'
obj.getProp("fOO");          //returns 'bar'
obj.getProp("CAMELCASE");    //returns 'humpy' 
obj.getProp("CamelCase");    //returns 'humpy'

大文字と小文字を区別しない設定:

var obj = {foo: 'bar', camelCase: 'humpy'}

obj.setProp('CAmelCasE', 'super humpy');     //sets prop 'camelCase' to 'super humpy'
obj.setProp('newProp', 'newval');      //creates prop 'newProp' and sets val to 'newval'  
obj.setProp('NewProp', 'anotherval');  //sets prop 'newProp' to 'anotherval'
于 2015-10-15T22:28:10.293 に答える
2

「正規化」するためにこれを行うことができますprop

 var normalizedProp = prop.toLowerCase();
 obj[normalizedProp] = val;
于 2012-09-18T20:26:41.673 に答える
0

繰り返しの必要はありません。文字列ではない可能性があるためprop、オブジェクトがネイティブに行うため、適切な場所で最初に文字列に強制する必要があります。簡単なゲッター関数は次のとおりです。

function objGetter(prop) {
  return obj[String(prop).toLowerCase()];
}

独自のプロパティへのアクセスを再設定する必要がある場合:

function objGetter(prop) {
  prop = String(prop).toLowerCase();

  if (obj.hasOwnProperty(prop)) {
    return obj.prop;
  }
}

そしてセッター:

function objSetter(prop, val) {
  obj[String(prop).toLowerCase()] = val;
}
于 2012-09-18T21:15:55.777 に答える
0

別の簡単な方法:

function getVal(obj, prop){
var val;
  prop = (prop + "").toLowerCase();
  for(var p in obj){
     if(obj.hasOwnProperty(p) && prop == (p+ "").toLowerCase()){
           val = obj[p]
           break;
      }
   }
   return val;
}

次のように使用します。

var obj = {
  foo:"bar",
  fizz:"buzz"
};
    getVal(obj,"FoO") -> returns "bar"
于 2018-01-12T12:56:15.823 に答える