19

キーが X で始まる次のマップからすべてのキーと値のペアを削除するにはどうすればよいですか。

var map = new Object(); 
map[XKey1] = "Value1";
map[XKey2] = "Value2";
map[YKey3] = "Value3";
map[YKey4] = "Value4";

編集

おそらく ^ を使用して、正規表現を使用する方法はありますか。キーが「X」ではなく「Xke」で始まるmap[^XKe] のようなもの

4

4 に答える 4

16

を使用してマップ キーを反復処理できますObject.key

最も簡単な解決策は次のとおりです。

デモはこちら

Object.keys(map).forEach(function (key) {
 if(key.match('^'+letter)) delete obj[key];
});

removeKeyStartsWithしたがって、あなたが言ったように、正規表現を使用した別のバージョンを次に示します。

function removeKeyStartsWith(obj, letter) {
  Object.keys(obj).forEach(function (key) {
     //if(key[0]==letter) delete obj[key];////without regex
           if(key.match('^'+letter)) delete obj[key];//with regex

  });
}

var map = new Object(); 
map['XKey1'] = "Value1";
map['XKey2'] = "Value2";
map['YKey3'] = "Value3";
map['YKey4'] = "Value4";

console.log(map);
removeKeyStartsWith(map, 'X');
console.log(map);

Regexあなたが言ったように letter=Xke を使用する場合でも、ソリューションはあなたのニーズをカバーしますが、 Regex を使用しない他のソリューションの場合は、次を置き換える必要があります。

Key[0]==letterkey.substr(0,3)==letter

于 2013-09-03T18:52:26.977 に答える
1

前提条件

元の入力を仮定します:

var map = new Object();

map[XKey1] = "Value1";
map[XKey2] = "Value2";
map[YKey3] = "Value3";
map[YKey4] = "Value4";

そして、patternキーをフィルタリングしたいものを含む変数を想定します(例: "X"、、、...)。"Y""prefixSomething"

解決策 1 - jQuery を使用してフィルタリングし、新しいオブジェクトを作成する

var clone = {};

$.each(map, function (k, v) {
  if (k.indexOf(pattern) == 0) { // k not starting with pattern
    clone[k] = v;
  }
});

解決策 2 - 純粋な ECMAScript を使用して新しいオブジェクトを作成する

var clone = {};

for (var k in map) {
  if (map.hasOwnProperty(k) && (k.indexOf(pattern) == 0)) {
    clone[k] = map[k];
  }
}

解決策 3 - 純粋な ECMAScript を使用し、ソース オブジェクトを使用する

for (var k in map) {
  if (map.hasOwnProperty(k) && (k.indexOf(pattern) == 0)) {
    delete map[k];
  }
}

または、最新のブラウザーでは:

Object.keys(map).forEach(function (k) {
  if (k.indexOf(pattern) == 0) {
    delete map[k];
  }
});

更新 - パターン マッチに正規表現を使用する

kキーが次の文字で始まる場合、一致させるために次を使用する代わりに:

k[0] == letter // to match or letter

kまたは、キーが次の文字列で始まる場合に一致します。

k.indexOf(pattern) // to match a string

代わりに次の正規表現を使用できます。

new Regexp('^' + pattern).test(k)
// or if the pattern isn't variable, for instance you want
// to match 'X', directly use:
//   /^X/.test(k)
于 2013-09-03T18:48:07.900 に答える