2015-03-03 16 views
5

वहाँ से पहले अपने replacer कहा जाता है करने के लिए एक रास्ता है एक वस्तु की अपनी toJSON यह बदल देती है, ताकि मैं वस्तु या अपने प्रोटोटाइप पर toJSON अधिभावी के बिना नहीं बल्कि अपने JSON के अनुकूल रूप से मूल वस्तु, साथ काम कर सकते , ऑब्जेक्ट को प्री-प्रोसेस करना, या JSON.stringify का अपना संस्करण लिखना?ऑब्जेक्ट के toJSON * से पहले replacer * को कॉल करें?

उदाहरण के लिए: मान लीजिए कि मैं उनके सामान्य क्रमिकरण (which is toISOString) से अलग Date उदाहरणों को क्रमबद्ध करना चाहता हूं। समस्या है, यह एक स्ट्रिंग (नीचे स्निपेट देखें) क्योंकि Date.prototype.toJSON मेरी replacer से पहले कहा जाता है देखता है (यह सवाल नहीं विशिष्ट Date के लिए, यह सिर्फ एक उदाहरण है।), मेरे replacer Date वस्तु नहीं देखता ।

var obj = { 
 
    d: new Date() 
 
}; 
 
snippet.log(getType(obj.d));  // "[object Date]" 
 

 
var json = JSON.stringify(obj, function(key, value) { 
 
    if (key === "d") { 
 
    snippet.log(getType(value)); // "string" <== Want to see a Date here 
 
    } 
 
    return value; 
 
}); 
 

 
function getType(value) { 
 
    var to = typeof value; 
 
    if (to === "object") { 
 
    to = Object.prototype.toString.call(value); 
 
    } 
 
    return to; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

वहाँ एक रास्ता replacer पहले कहा जाता प्राप्त करने के लिए है? मैं Date.prototype.toJSON को ओवरराइड नहीं करना चाहता, ऑब्जेक्ट को प्री-प्रोसेस कर सकता हूं, या अपना खुद का JSON.stringify लिखना चाहता हूं, लेकिन मुझे कोई और तरीका नहीं दिख रहा है।

उत्तर

7

तो मैं समझता हूँ कि आप इस चाल करना चाहिए को सही, मैं बहुत यकीन है कि this हमेशा वस्तु JSON.stringify वर्तमान में पुनरावृत्ति है कर रहा हूँ ओवर:

var json = JSON.stringify(obj, function(key, value) { 
    if (key === "d") { 
    snippet.log(getType(this[key])); 
    } 
    return value; 
}); 
+0

सुंदर। यह भी [असाधारण मामले के लिए काम करता है] (http://jsbin.com/zeciqiwawo/1) जहां आप एक दस्तावेज़ खंड ('JSON.stringify (नई तिथि()) को स्ट्रिंग कर रहे हैं '), पूरे दस्तावेज़ नहीं, धन्यवाद [चरण 9-11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3)। –

+0

वास्तव में अच्छा है .. –

3

MDN से:

वस्तु जिसमें कुंजी मिला था replacer के this पैरामीटर के रूप में प्रदान की जाती है।

तो तुम यह कर सकते हैं:

var obj = { 
 
    d: new Date() 
 
}; 
 
snippet.log(getType(obj.d));  // "[object Date]" 
 

 
var json = JSON.stringify(obj, function(key, value) { 
 
    if (key === "d") { 
 
    snippet.log(getType(this[key])); 
 
    } 
 
    return value; 
 
}); 
 

 
function getType(value) { 
 
    var to = typeof value; 
 
    if (to === "object") { 
 
    to = Object.prototype.toString.call(value); 
 
    } 
 
    return to; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

धन्यवाद। मुझे पता था कि एक बेहतर तरीका होना चाहिए था। :-) –

संबंधित मुद्दे