在Javascript中从地图中删除某些元素

时间:2013-09-03 18:36:17

标签: javascript jquery

如何从以下地图中删除所有键/值对,其中键以X 开头。

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

修改

有没有办法通过正则表达式,可能使用^。 像map [^ XKe],其中键以'Xke'而不是'X'开头

4 个答案:

答案 0 :(得分:12)

我建议:

function removeKeyStartsWith(obj, letter) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && prop[0] == letter){
            delete obj[prop];
        }
    }
}

JS Fiddle demo

顺便说一下,使用Object-literal而不是构造函数通常更容易(并且似乎被认为是“更好的练习”),因此以下值得展示(即使出于某种原因,您更喜欢{{ 1}}语法:

new Object()

JS Fiddle demo

如果你真的想使用正则表达式(但为什么?),那么以下工作:

var map = {
    'XKey1' : "Value1",
    'XKey2' : "Value2",
    'YKey3' : "Value3",
    'YKey4' : "Value4",
};

JS Fiddle demo

最后(至少对于现在)一种扩展function removeKeyStartsWith(obj, letter, caseSensitive) { // case-sensitive matching: 'X' will not be equivalent to 'x', // case-insensitive matching: 'X' will be considered equivalent to 'x' var sensitive = caseSensitive === false ? 'i' : '', // creating a new Regular Expression object, // ^ indicates that the string must *start with* the following character: reg = new RegExp('^' + letter, sensitive); for (var prop in obj) { if (obj.hasOwnProperty(prop) && reg.test(prop)) { delete obj[prop]; } } } var map = new Object(); map['XKey1'] = "Value1"; map['XKey2'] = "Value2"; map['YKey3'] = "Value3"; map['YKey4'] = "Value4"; console.log(map); removeKeyStartsWith(map, 'x', true); console.log(map); 原型的方法,允许用户搜索以给定字符串开头的属性,以给定字符串结尾或(通过同时使用Object startsWith给定的字符串(有或没有区分大小写:

endsWith

JS Fiddle demo

参考文献:

答案 1 :(得分:5)

您可以使用Object.key迭代地图密钥。

最简单的解决方案是:

DEMO HERE

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,但对于没有正则表达式的其他解决方案,您将需要替换:

带有Key[0]==letter

key.substr(0,3)==letter

答案 2 :(得分:1)

的前提条件

假设您的原始输入:

var map = new Object();

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

假设变量pattern包含您想要过滤的密钥(例如"X""Y""prefixSomething",...)。< / p>

解决方案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)

答案 3 :(得分:1)

你可以轻松地以这种方式获得它。

var map = new Object(); 
map['Key1'] = "Value1";
map['Key2'] = "Value2";
map['Key3'] = "Value3";
map['Key4'] = "Value4";
console.log(map);
delete map["Key1"];
console.log(map);

这是删除它的简便方法。