【问题标题】:Filter out object by properties (not deleting)按属性过滤掉对象(不删除)
【发布时间】:2018-04-21 10:39:54
【问题描述】:

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

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

我正在尝试返回没有“社交”和“方法”属性的对象。

首先我尝试在计算属性中像这样删除,但它会从主对象中删除属性:

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"
}

【问题讨论】:

  • 你的目标是什么?为什么您希望属性保留但不知何故不可见?您可以简单地克隆对象并删除克隆上的属性吗?
  • @isherwood 您的方法是最简单且有效的。基本上,Object.assign({}, this.myObj)。谢谢

标签: javascript object ecmascript-6 vue.js


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

【讨论】:

    【解决方案2】:

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

    有一个 stage 3 proposal 用于休息/传播属性,可以让你这样做:

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

    (然后忽略 Social 和 Method 常量。)但它仍然只是第 3 阶段(尽管它接近第 4 阶段并且在 ES2018 中看起来不错;在 Chrome 和火狐)。

    请注意,这只会处理自己的、可枚举的属性。

    在 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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 完全有效,但请注意,从对象中删除属性往往会对其进行优化,从而使属性访问显着变慢(相对而言)。不过,大多数时候你并不关心。
      【解决方案4】:

      你想要的函数是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;
        })
      }
      

      【讨论】:

      • 这与删除方法的结果有何不同? (我还不清楚 OP 想要什么,但是....)
      • 对于初学者来说,delete 会留下一个空引用并改变有问题的对象。这将创建一个仅具有所需属性的新对象(无突变)(这是 OP 想要的,删除了特定属性的对象)。只是假装javascript没有删除运算符,它没用@isherwood
      猜你喜欢
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多