2016-09-05 25 views
7

मैंने एसी # लाइब्रेरी विकसित की है जो 3 परियोजनाओं में उपयोग की जाती है जो कोड के उस विशिष्ट टुकड़े में रिले करती है, हालांकि, मुझे अभी भी उस कोड को जावास्क्रिप्ट में उपयोग करने की आवश्यकता है, इसलिए मैं इसे पोर्ट कर रहा हूं, बात यह है कि, मुझे नहीं लगता कि मैं एक ही तर्क को दोहरा सकता हूं, उदाहरण के लिए, मैं कुछ दिनों के लिए इस बारे में सोच रहा हूं, मुझे जवाब नहीं मिल सका।पोर्टिंग सी # 3 डी ऐरे जेएस 3 डी ऐरे

सी # लाइब्रेरी में मेरे पास एक 3 डी सरणी है जो एप्लिकेशन में मूल संपत्ति की तरह है, और मुझे लगता है कि जेएस पर्यावरण में यह काम कैसे करना है।

उदाहरण के लिए मैं कोड के इस टुकड़े है:

public Obj[,,] objs = new Obj[18, 14, 8]; 

जो में मैं हर एक की स्थिति में वस्तुओं का आवंटन होता है, और बंदरगाह की कोशिश कर रहा है कि जावास्क्रिप्ट को, मालूम होता है परिणाम होगा में:

var 3dArr = new Array(); 
    3dArr[0] = new Array(); 
    3dArr[0][0] = new Array(); 

क्या यह हमेशा पहली स्थिति में सरणी ऑब्जेक्ट को नहीं रखेगा और यदि मैं और भी सेट करता हूं तो मैं पूरी सरणी खो दूंगा? या मैं गलत हूं

+1

आप सही हैं। कोई अंतर्निहित प्रकार नहीं है जो जेएस में बहुआयामी सरणी का प्रतिनिधित्व करता है। – zerkms

+1

आप जेएस में इसे नेस्टेड एरेज़ के रूप में बना सकते हैं, मुझे लगता है कि यह सी # 'सार्वजनिक ओब्ज [ओबीजे [ओबीजे []]] objs' में इसका वर्णन करेगा, या आप एक एपीआई के साथ एडाप्टर बनाते हैं जो एन-आयामी स्थिति और मानचित्र लेता है उन्हें आंतरिक डेटा-संरचना पर एक-आयामी कुंजी/सूचकांक तक। जैसे 'key = [x, y, z] .join ('::')' या 'index = (x * 14 + y) * 8 + z'। निश्चित + सत्यापन, कि स्थिति सीमा से बाहर नहीं है। – Thomas

उत्तर

2

लेखन के समय, जावास्क्रिप्ट में कोई भाषा सुविधा नहीं है जो सी # में बहुआयामी सरणी जैसा दिखता है। पूरे आवेदन के उपयोग के लिए सामान्य सरणी का पर्दाफाश करने की भी सिफारिश नहीं की जाती है क्योंकि इससे पूरे कोड को गलती से सरणी में लिखना आसान हो जाता है जिसे वह पकड़ना नहीं चाहता है।

हालांकि, यह एक साधारण नई कक्षा में आवश्यक सरणी को समाहित करने के लिए अपेक्षाकृत आसान होना चाहिए, उदा। नीचे दिए गए कोड में Array3d:

/***** CODE OF THE ARRAY *****/ 
 
function Array3d(width, height, depth, type) { 
 
    this.width = width; 
 
    this.height = height; 
 
    this.depth = depth; 
 
    this.type = type; 
 
    this.array = new Array(width * height * depth); 
 
} 
 

 
Array3d.prototype = { 
 
    get: function(x, y, z) { 
 
     return this.array[calcIndex(this, x, y, z)]; 
 
    }, 
 
    set: function(x, y, z, item) { 
 
     if (!(item instanceof this.type)) { 
 
      throw new Error(item + ' is not instance of ' + this.type + '.'); 
 
     } 
 
     this.array[calcIndex(this, x, y, z)] = item; 
 
    } 
 
}; 
 

 
function calcIndex(array3d, x, y, z) { 
 
    return x + array3d.width * y + array3d.width * array3d.height * z; 
 
} 
 

 
/***** USAGE CODE *****/ 
 
function Something(i) { 
 
    this.index = i; 
 
} 
 

 
var array3d = new Array3d(10, 11, 12, Something); 
 
var something = new Something(11); 
 
array3d.set(4, 0, 0, something); 
 
var gettingBack = array3d.get(4, 0, 0); 
 
if (gettingBack === something) { 
 
    console.log('1: Works as expected'); 
 
} 
 
else { 
 
    console.error('1: Not expected ' + gettingBack); 
 
} 
 
gettingBack = array3d.get(0, 0, 4); 
 
if (gettingBack == null) { 
 
    console.log('2: Works as expected'); 
 
} 
 
else { 
 
    console.error('1: Not expected ' + gettingBack); 
 
}

+1

हाँ, मैंने इसे x, y और z निर्देशांक के आधार पर ऑब्जेक्ट की स्थिति की गणना करने के बारे में एक विचार दिया, बस यह सुनिश्चित करना चाहता था कि मैं 100% निश्चित था कि सरणी [x, y, z] का उपयोग करके इसे प्राप्त करना संभव नहीं था। आपका उत्तर जाने के तरीके जैसा लगता है। मैं इसे जाने दूंगा और इसका परीक्षण करूंगा। धन्यवाद! –

1

इस प्रयास करें ...

Array3d = function (width, height, depth, defaultValue) { 
    width = width || 1; 
    height = height || 1; 
    depth = depth || 1; 
    defaultValue= defaultValue|| 0; 
    var arr = []; 
    for (var i = 0; i < width; i++) { 
     arr.push([]); 
     for (var j = 0; j < height; j++) { 
     var last = arr[arr.length - 1]; 
     last.push([]); 
     for (var k = 0; k < depth; k++) { 
      last[last.length - 1].push(defaultValue); 
     } 
     } 
    } 
    return arr; 
} 
console.log(new Array3d(3, 5, 2, 0)); 

तो, width, height, depth (इन तीन 1 के लिए डिफ़ॉल्ट) निर्दिष्ट करें, और defaultValue (शून्य पर डिफ़ॉल्ट) और आप इसे किसी भी जावास्क्रिप्ट सरणी के रूप में उपयोग कर सकते हैं ...

1

जावास्क्रिप्ट में एक 3 डी सरणी सरणियों के सरणियों की एक सरणी के रूप में बनाया जाता है:

var 3DArr = [[[],[],[]],[[],[],[]],[[],[],[]]]; 

अब 3DArr इसके अंदर सरणियों, जिनमें से प्रत्येक भी सरणियों शामिल साथ एक सरणी है।तो अगर आप (उदाहरण के लिए) कर सकते हैं:

3DArr[0][1].push(10); 
console.log(3DArr); // [[[],[10],[]],[[],[],[]],[[],[],[]]] 
0

नए ब्राउज़रों में, सरणियों की सरणी Array.from साथ प्रारंभ किया जा सकता है:

a = Array.from(Array(3),() => Array.from(Array(3),() => Array(3).fill(0))) 
 

 
console.log(JSON.stringify(a))

एक तरफ ध्यान दें के रूप में, जावास्क्रिप्ट "सरणी "एक विशेष Dictionary की तरह है जो इसकी पूर्णांक कुंजी का उपयोग करता है:

a = [] 
 
a['1'] = 2 
 
a.b = 'c' 
 
a[3.14] = Math.PI 
 

 
console.log(a)     // "[undefined, 2]" 
 
console.log(a[1], a.b, a['3.14']) // "2 c 3.141592653589793"

ताकि आप "आयाम" के सभी आरंभ करने से पहले इसे करने के लिए मान निर्दिष्ट कर सकते हैं:

function set(a, x, y, z, v) { 
 
    if(!a[x]) a[x] = [] 
 
    if(!a[x][y]) a[x][y] = [] 
 
    a[x][y][z] = v 
 
} 
 

 
a = [] 
 
set(a, 1, 2, 3, 4) 
 

 
console.log(a)