1

我想知道是否有一种原生/优雅的方式来做到这一点:

var object = {
    value: 1,
    desc: 'an object',
    method: function(){
        return this.description + ' with value: ' + this.value;
    },
};
var onlyProperties = JSON.parse(JSON.stringify(object));

如您所见,我只想要其中没有任何方法的属性。上面的代码有效,但这样做感觉不对。

4

4 回答 4

2

如果您不是在寻找递归解决方案,这里有一个简单的方法。

for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof obj[i] === 'function') {
        delete obj[i];
    }
}

如果您想要没有功能的副本:

var copy = {};
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof obj[i] !== 'function') {
        copy[i] = obj[i];
    }
}
于 2013-09-06T12:56:49.003 回答
1

原生方式是这样的:

var foo = {
    /* stuff*/
};

var onlyProperties = {};

for (var bar in foo) {
    if (typeof foo[bar] != "function") {
        onlyProperties[bar] = foo[bar];
    }
}

这样,您既可以保留原始对象,也可以保留仅包含其非函数成员的新对象。

于 2013-09-06T12:58:38.063 回答
0

那么这个返回函数调用呢?

var obj = {
  value: 1,
  desc: 'an object',
  method: function(){ return this.desc + ' with value ' + this.value; }
};
console.log(JSON.stringify(obj)); // "{"value":1,"desc":"an object"}"

如果删除方法调用是您的目标,JSON.stringify那么应该没问题。如果你真的想要粒度:

JSOS.stringify(obj, function(k,v){
  // testing for `typeof x === 'function' really won't get hit,
  // but this does give you an example of how to proceed.
  return (typeof v === 'function' ? undefined : v);
});

您可以使用该replacer参数来更好地控制序列化的内容。

于 2013-09-06T12:58:00.090 回答
0
for (var p in object) {
  if (object.hasOwnProperty(p)) {
    if (typeof object[p] === 'function') delete object[p];
  }
}
于 2013-09-06T12:58:30.693 回答