按属性过滤掉对象(不删除)

时间:2017-11-08 16:28:50

标签: javascript object ecmascript-6 vue.js

我有一个看起来像这样的对象:

var myObj: {
    2:"None",
    20:"A",
    31:"A",
    32:"A",
    Social:"B",
    Method:"None"
}

我试图在没有' Social'和'方法'属性。

首先,我尝试在计算属性中删除这样的内容,但它从主对象中删除了属性:

props: ['myObj']

computed: {
     filterOut: {
        var myObject = this.myObj
        delete myVar['Social'];
        delete myVar['Method'];

        return myObject
    }
}

然后我尝试使用过滤器,但它不允许我这样做:

      var myObject = this.myObj.filter(key => {
          return key != 'Method' || key != 'Social'
      })

      return myObject
  

TypeError:this.myObj.filter不是函数

上述对象下面对象的最佳方法是什么?

var myObj: {
    2:"None",
    20:"A",
    31:"A",
    32:"A"
}

4 个答案:

答案 0 :(得分:3)

只需创建一个没有这些属性的新对象。

stage 3 proposal的休息/点差属性可以让你这样做:

const {Social, Method, ...newObj} = originalObj;

(然后忽略SocialMethod常数。)但它仍然只是第3阶段(虽然它已接近第4阶段并且在ES2018中看起来很好;在Chrome和Firefox的最新版本中,它支持没有特殊标记。

请注意,这只会处理拥有的,可枚举的属性。

在ES2015 +中你可以这样做:

const newObj = {};
for (const key of Object.keys(originalObj)) {
    if (key != "Social" && key != "Method") {
        newObj[key] = originalObj[key];
    }
}

或者在ES5中:

var newObj = {};
Object.keys(originalObj).forEach(function(key) {
    if (key != "Social" && key != "Method") {
        newObj[key] = originalObj[key];
    }
});

这两者都处理自己的,可枚举的属性;如果您想要所有非符号属性,请改用Object.getOwnPropertyNames

答案 1 :(得分:2)

使用Object.assign创建新对象,然后删除。



var myObj =  {
    2:"None",
    20:"A",
    31:"A",
    32:"A",
    Social:"B",
    Method:"None"
};

var new_obj = Object.assign({},myObj); // or use spread operator {...myObj};


delete new_obj.Social;
delete new_obj.Method;

console.log(new_obj);




答案 2 :(得分:1)

您想要的功能是reduce

尝试这样的事情:

function deleteProperty(object, property) {
  return Object.keys(object).reduce((obj, key) => {
    obj = obj || {};
    if (key !== property) {
      return { ...obj, [key]: object[key]};
    }
    return obj;
  })
}

如果你在浏览器中工作或者不想处理babel,你可能需要做这样的事情。请注意以下是未经测试的,上面是功能测试,我几乎每天都使用它。

function deleteProperty(object, property) {
  return Object.keys(object).reduce((obj, key) => {
    obj = obj || {};
    if (key !== property) {
      return Object.assign(obj, {[key]: object[key]});
    }
    return obj;
  })
}

答案 3 :(得分:1)

也许这种通用解决方案也可以提供帮助:



var myObj = {
    2: "None",
    20: "A",
    31: "A",
    32: "A",
    Social: "B",
    Method: "None"
}

var filtered = _.pickBy(myObj, (v,k)=> _.toInteger(k))

console.log(filtered)

<script src="https://unpkg.com/lodash"></script>
&#13;
&#13;
&#13;