关于删除对象中一组数据的问题?

var obj = {'a':'b','c':'d','e':'f'};
var arr = ['a','c'];
for (var i in obj) {
    for (var k=0;k<arr.length;k++) {
        if (i != arr[k]) {
            delete obj[i];
            console.log(obj);
        }
    }
}

打印出来是这样的:
图片描述

但是我对象只要两组数据的时候:、

var obj = {'a':'b','c':'d'};
var arr = ['a',];
for (var i in obj) {
    for (var k=0;k<arr.length;k++) {
        if (i != arr[k]) {
            delete obj[i];
            console.log(obj);
        }
    }
}

图片描述
这样就没问题了,
请问是我该怎么做。
谢谢!

阅读 5.4k
7 个回答

其实可以不需要循环数组:

var obj = {'a':'b','c':'d','e':'f'};
var arr = ['a','c'];

for (let k in obj) {
    if (arr.indexOf(k) == -1) {
        delete obj[k];
    }
}
arr.map(function(val){
    delete obj[val]
})

不要搞那么复杂,眼晕……

var obj = {'a':'b','c':'d','e':'f'};
var arr = ['a','c'];
var result = {};
for (var i in obj) {
    for (var k=0;k<arr.length;k++) {
        if (i == arr[k]) {
            result[i] = obj[i]
        }
    }
}
console.log(result);

至于你这个为啥没delete掉,原因是你这么循环注定每一次都会出现不等的现象,所以会被删完。不是数组长度不够,我看错了。

至于这个实现方法还有很多种,我只是就你的代码而言,可以看看其他回复的方法,貌似如今大家都不怎么用for循环了。

问题在于这句:
if(i!=arr[k])

因为要循环整个数组,所以if总能找到真值,因此数据就都被删光了。

你的第二个例子不是因为对象只有两组数据,而是因为数值只有一个值。

把你的循环拆开看

var obj = {'a':'b','c':'d','e':'f'};
var arr = ['a','c'];
for (var i in obj) {
    for (var k=0;k<arr.length;k++) {
        if (i != arr[k]) {
           delete obj[i];
           console.log(obj);
        }
    }
}

第一次、i = "a" 进入第二道循环
    k=0 arr[k]="a" 判断进不去
    k=1 arr[k]="c" c被删掉了
    
第二次、类推、把a删了

所以你的代码会出现这样的问题



    

刚才理解错题意,其实鱼香肉丝的答案已经正确了,再给你提供一个反过来的思路:

var obj = {'a':'b','c':'d','e':'f'};
var arr = ['a','c'];

arr.reduce((prev, key)=>{
  if(obj.hasOwnProperty(key)) prev[key] = obj[key];
  return prev;
}, {})
/**
 * 删除对象指定的属性
 * @param  {[Object]} obj   [被删除属性的对象]
 * @param  {[Array]} props [需要删除的属性数组]
 * @return {[Object]}       [返回删除属性后的对象]
 */

    function deleteProp(obj, props) {
        var result = Object.assign({},obj);    //拷贝一份副本,防止删除原数据
        for (var i = 0; i < props.length; i++) {
            //if (result[props[i]]) {          //如果值或值的隐式转换值为false的话这里逻辑不严谨
            if (result.hasOwnProperty(props[i])) {
                delete result[props[i]]
            }
        }
        return result;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题