मैंने रिकर्सन का उपयोग करके एक अलग समाधान लिखा है। मैं इनपुट तत्वों के नाम विशेषता नामस्थान के लिए इसका उपयोग कर रहा था। उदाहरण के लिए, उदाहरण के लिए,
<input type="number" name="testGroup.person.age" />
और मान लें कि हम उस इनपुट का मान "25" पर सेट करते हैं।
var data = {
testGroup: {
person: {
name: null,
age: null,
salary: null
}
}
};
तो यहां लक्ष्य स्वचालित रूप से उस डेटा संरचना में सही स्थिति में हमारे इनपुट तत्व में मूल्य डालने के लिए है: हम भी कहीं न कहीं हमारे कोड में एक वस्तु है।
मैं इस छोटे से समारोह एक नेस्टेड के आधार पर वस्तु बनाने के लिए लिखा है नामस्थान की जो कुछ भी सरणी आप इसे पारित:
var buildObject = function (obj, namespaceArray, pos) {
var output = {};
output[namespaceArray[pos]] = obj;
if (pos > 0) {
output = buildObject(output, namespaceArray, pos-1);
}
return output;
};
यह कैसे काम करता है? यह namespaceArray
सरणी के अंत में शुरू होता है, और एक संपत्ति के साथ एक वस्तु बनाता है, जिसका नाम namespaceArray
में अंतिम स्लॉट में जो भी है, और जिसका मान obj
है।फिर यह उस ऑब्जेक्ट को अतिरिक्त ऑब्जेक्ट्स में लपेटता है जब तक कि यह namespaceArray
में नामों से बाहर नहीं हो जाता है। pos
namespaceArray
सरणी की लंबाई है। आप इसे पहले फंक्शन कॉल में काम कर सकते हैं, if (typeof(pos) === "undefined") pos = namespaceArray.length - 1
जैसे कुछ, लेकिन फिर आपके पास फ़ंक्शन रिकर्स किए जाने पर हर बार मूल्यांकन करने के लिए एक अतिरिक्त कथन होगा।
सबसे पहले, हम नाम स्थान विभाजक चारों ओर एक सरणी में input
की name
विशेषता विभाजित है और इनपुट के मूल्य मिलता है:
var namespaceArray = inputElement.name.split("."),
obj = inputElement.value;
// Usually you'll want to do some undefined checks and whatnot as well
तो हम बस हमारी फ़ंक्शन को कॉल करें और कुछ चर के परिणाम में निर्दिष्ट करें:
var myObj = buildObject(obj, namespaceArray, namespaceArray.length - 1);
myObj अब इस तरह दिखेगा:
{
testGroup: {
person: {
age: 25
}
}
}
इस बिंदु मैं jQuery के विस्तार समारोह का उपयोग करें कि संरचना मूल डेटा वस्तु में वापस मर्ज करने के लिए कम:
data = $.extend(true, data, myObj);
हालांकि
, दो वस्तुओं विलय ढांचे से मुक्त जावास्क्रिप्ट में करने के लिए बहुत मुश्किल नहीं है और वहाँ existing code के बहुत है जो काम अच्छी तरह से हो जाता है।
मुझे यकीन है कि यह करने के लिए और अधिक कुशल तरीके हैं, लेकिन यह विधि मेरी आवश्यकताओं को अच्छी तरह से पूरा करती है।
@ टिम यही मैं सोच रहा था, लेकिन आप इसे मेरे सामने मिला! :) –
¬¬ आपको पहले मिला? :(हाहा +1 – JCOC611
@ टिमडाउन का उल्लेख है कि इस तरह के नाम-रिक्त स्थान का उपयोग वास्तव में मूल रूप से समर्थित नहीं है और कोड को काफी गन्दा और बनाए रखने में कठोर हो सकता है। ऐसा लगता है कि किसी अन्य भाषा से शैलियों को पोर्टल करने पर ऐसा लगता है कि वहां बेहतर विकल्प – Raynos