Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中从映射中删除某些元素_Javascript_Jquery - Fatal编程技术网

在Javascript中从映射中删除某些元素

在Javascript中从映射中删除某些元素,javascript,jquery,Javascript,Jquery,如何从以下映射中删除所有键/值对,其中键以X开头 var map = new Object(); map[XKey1] = "Value1"; map[XKey2] = "Value2"; map[YKey3] = "Value3"; map[YKey4] = "Value4"; 编辑 有没有办法通过正则表达式,可能是使用^。 类似于map[^XKe],其中键以'XKe'开头,而不是'X'我建议: function removeKeyStartsWith(obj, letter) {

如何从以下映射中删除所有键/值对,其中键以X开头

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

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

我建议:

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

顺便说一句,使用对象文字通常比使用构造函数更容易(而且似乎被认为是“更好的实践”),因此下面值得一看(即使出于某种原因,您更喜欢
newobject()
语法:

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

如果您真的想使用正则表达式(但为什么?),那么以下方法很有效:

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);

最后(至少现在)一种扩展
对象
原型的方法,允许用户搜索以给定字符串开头、以给定字符串结尾的属性,或者(通过同时使用
startsWith
endsWith
)是给定字符串(区分大小写:

Object.prototype.removeIf = function (needle, opts) {
    var self = this,
        settings = {
            'beginsWith' : true,
            'endsWith' : false,
            'sensitive' : true
        };
    opts = opts || {};
    for (var p in settings) {
        if (settings.hasOwnProperty(p)) {
            settings[p] = typeof opts[p] == 'undefined' ? settings[p] : opts[p];
        }
    }
    var modifiers = settings.sensitive === true ? '' : 'i',
        regString = (settings.beginsWith === true ? '^' : '') + needle + (settings.endsWith === true ? '$' : ''),
        reg = new RegExp(regString, modifiers);
    for (var prop in self) {
        if (self.hasOwnProperty(prop) && reg.test(prop)){
            delete self[prop];
        }
    }
    return self;
};

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

console.log(map);
map.removeIf('xkey2', {
    'beginsWith' : true,
    'endsWith' : true,
    'sensitive' : false
});
console.log(map);

参考资料:

先决条件 假设您的原始输入:

var map = new Object();

map[XKey1] = "Value1";
map[XKey2] = "Value2";
map[YKey3] = "Value3";
map[YKey4] = "Value4";
并假设变量
模式
,该模式将包含要筛选的关键字(例如
“X”
“Y”
“prefixSomething”
,…)

解决方案1-使用jQuery筛选并创建新对象 解决方案2-使用纯ECMAScript并创建新对象 解决方案3-使用纯ECMAScript和源对象 或者,在现代浏览器中:

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)

可以使用
Object.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]==letter
使用
Key.substr(0,3)==letter

您可以通过这种方式轻松获得它

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);


这是移除它的简单方法。

使用loop@Blazemonger我认为他们的意图是在数组
map
中循环,如果键以“x”开头删除该元素。@user1477388:然后他、她或他们需要解释并澄清这一点,而不是依靠猜测工作。@DavidThomas我非常清楚,但是……你下面的答案很好,很好!是不是
XKey1
一个具有不同值的变量?还是那些应该在
map[“XKey1]”等引号中;
?感谢您是否可以通过正则表达式编辑我的问题。然后您需要substr@newbie:不,这不符合书面要求,但您可以使用
prop.indexOf(letter)==0
。然而,虽然我还没有在中添加该选项,但我已经发布了一个解决方案,它应该可以满足您的需要(据我目前所知),这扩展了
对象
原型。我将很快添加参考和解释(首先要做一些家务,抱歉!XD)。+1:回答不错。我发现选项/设置方法有点过头,有点像厨房水槽,更愿意使用多种方法(或者确实通过正则表达式进行匹配),但仍然……不能说你没有特意写出一个好的答案!@haylem:谢谢!是的,我大体上同意你的看法;但上一次迭代的“厨房水槽”风格部分是为了尝试和预测进一步的请求(另外,我非常喜欢使事情易于扩展,我认为这是一种方法)。=)谢谢,通过正则表达式可以吗?我编辑了我的问题。@newbie:不,不是。或者至少不是按照你在问题中的意思。但是你可以用正则表达式来做
startsWith
。我会更新我的答案。你正在使用k[0]注意,我不建议使用k[0]来检查第一个字母。这是大卫最初的答案。我从一开始就建议使用
k.indexOf(pattern)==0
,其中pattern可以是
“Xke”
或任何字符串。它更通用(对于一个很长的键也可能很慢,但这不太可能。@新手:另外,虽然你可以使用正则表达式,但我真的不知道你为什么会这样做。我也不建议使用这种方法。谢谢你,通过正则表达式可以吗?我已经编辑了我的问题。键[0]==字母,如果我的钥匙以“XKe”开头而不是X@newbie如果您使用XKe作为字母或代替键[0]==字母使用键,则使用正则表达式的解决方案将有效。substr(0,3)==字母谢谢。请不要介意,我应该如何在JSFIDLE中测试,我选择了all,然后单击Run@newbie使用浏览器的控制台,您将在那里看到结果
new Regexp('^' + pattern).test(k)
// or if the pattern isn't variable, for instance you want
// to match 'X', directly use:
//   /^X/.test(k)
Object.keys(map).forEach(function (key) {
 if(key.match('^'+letter)) delete obj[key];
});
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);
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);