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

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 に答える