2012-01-25 20 views
9

मैं कई आयामों के विरुद्ध, जावास्क्रिप्ट का उपयोग करके, मूल्य को देखने का एक आसान तरीका ढूंढ रहा हूं:क्या जावास्क्रिप्ट लुकअप टेबल बनाने का कोई आसान तरीका है?

उदाहरण के लिए। इसलिए मैं तो पेज

Colour: Blue, Red 

Size: Small, Large 
पर ड्रॉपडाउन की एक संख्या है

Colour Size Price 

Blue S £45 

Blue L £98 

Red  S £65 

Red  L £31 

(मैं इस वर्णन करने के लिए, डेटा एक बहुत ही इसी तरह के प्रारूप में एक डेटाबेस से आ रहा है उत्पादों और उत्पाद विकल्पों का उपयोग करने जा रहा हूँ)

तो - मुझे पता है ... दिया "ब्लू + छोटे", किस कीमत

मुझे पता नहीं क्या आदेश ड्रॉपडाउन में कर रहे हैं, या जिस क्रम में रंग और आकार से खींच रहे हैं है चाहता हूँ डेटाबेस

जावास्क्रिप्ट में डेटा इस तरह एक सरणी हो सकता है:

{Colour:Blue, Size:Medium, Price:48},{Colour:Blue, Size:Large, Price:82} 

यह एक कच्चे उदाहरण है, लेकिन मैं जावास्क्रिप्ट में इस लक्ष्य को हासिल करने के लिए एक आसान तरीका काम नहीं कर सकते हैं।

+0

क्यों jQuery और नहीं सरल js? बस पूछ ... – Yoshi

+0

सरल js रूप में अच्छी तरह काम करेगा ... :) एक लंबा दिन – Paul

+0

क्यों आप jQuery के साथ ऐसा करना चाहते हैं कर दिया गया? एक बहु-आयामी जावास्क्रिप्ट सरणी का उपयोग करना एक आसान तरीका होगा। –

उत्तर

6

शायद यह?

var data = { 
    1: { 
    2: { 
     3: 45 
    } 
    }, 
    2: { 
    2: { 
     3: 98 
    } 
    } 
}; 

console.log(data[1][2][3]); // 45 
console.log(data[2][2][3]); // 98 

// or 
var A = 1, B = 2, C = 3; 
console.log(data[A][B][C]); // still 45 
+0

ए, बी और सी के लिए मान रैखिक नहीं हैं इसलिए ए के मान 1, 45, 89 हो सकते हैं ... क्या यह अभी भी इस समाधान के लिए काम करेगा? (जो मैंने सोचा था, लेकिन मैंने सोचा होगा कि मैंने क्या लिखा है) – Paul

+0

@ पॉल हां बिल्कुल। मैं ऑब्जेक्ट शाब्दिक नोटेशन का उपयोग कर एक ऑब्जेक्ट बना रहा हूं। आप जो कुछ भी * कुंजी * के रूप में चाहते हैं उसका उपयोग कर सकते हैं। हो सकता है कि आप अपना कुछ और डेटा जोड़ सकें ताकि हम समझ सकें कि आप क्या हासिल करने की कोशिश कर रहे हैं। – Yoshi

+0

काफी अपने डेटा है, प्रत्येक रिकॉर्ड 3 कुंजी मान जोड़े है, और मैं 3 कुंजी मान जोड़े (प्रत्येक स्तंभ के लिए एक) में पास करके तालिका में रिकॉर्ड का पता लगाने की कोशिश कर रहा हूँ .... मैं सबसे बड़ी समस्या यह लगता है मैं कॉलम के क्रम के साथ है हो रही है .... मैं जरूरी यह पता नहीं है, हालांकि शायद फिर से आदेश कर सकता है क्या मैं आह – Paul

5

इसका सबसे आम समाधान ओ (एन) शैली में सरणी पर लूपिंग है।

var filter = {Colour: 'blue', Size:'small'}; 
function matches_filter(filter, item){ 
    //you can also have variations on this function that 
    //allow for functions, regexes or anything you like in the filter... 
    for(var key in filter){ 
     if Object.prototype.hasOwnProperty.call(filter, key){ 
      if(item[key] !== filter[key]){ 
       return false; 
      } 
     } 
    } 
    return true; 
} 

var filtered_items = []; 
for(var i=0; i<items.length; i++){ 
    var item = items[i]; 
    if(matched_filter(filter, item){ 
     filtered_items.push(item); 
    } 
} 

जानवर मजबूर कर पीछे तर्क फिर वहाँ एक अच्छा मौका है यह सबसे अच्छा होगा सिर्फ सर्वर पर क्वेरी भेजने के लिए है कि आप किसी डेटा सेट है कि इतना बड़ा एक बेहतर एल्गोरिथ्म की आवश्यकता होती है अगर वह यह है कि और क्या इसका डेटाबेस आपके लिए कड़ी मेहनत करता है।

एक और पूर्ण उदाहरण के लिए आप दोजो टूलकिट से this code देख सकते हैं।

6

आप पेज लोड पर दो आयामी मानचित्र में कीमतें सूचीबद्ध कर सकते हैं (fiddle काम कर रहे हैं)।

1) मैं मामले में देखने-टेबल में चुनिंदा मूल्यों डाल आप उन्हें पहले से लोड करने के लिए है:

var tables = { 
    Colour: ["Blue", "Red"], 
    Size: ["Small", 'Medium, "Large"] 
}; 

2) यहाँ सरणी के रूप में अपनी कीमत टेबल है:

var array = [ 
    {Colour: "Blue", Size: "Small", Price: 45}, 
    {Colour: "Blue", Size: "Medium", Price: 48}, 
    {Colour: "Blue", Size: "Large", Price: 98}, 
    {Colour: "Red", Size: "Small", Price: 65}, 
    {Colour: "Red", Size: "Large", Price: 31} 
]; 

3)

for (var key in tables) 
    if (tables.hasOwnProperty(key)) { 
     selects[key] = form[key]; 
     selects[key].addEventListener("change", updateSpan); 

     var values = tables[key]; 
     len = values.length; 
     for (i = 0; i < len; i++) { 
      var option = document.createElement('option'); 
      option.appendChild(document.createTextNode(values[i])); 
      form[key].appendChild(option); 
     } 
    } 

4) अपनी कीमत टेबल अनुक्रमण: चयन (मूल्यों और घटना 'बदलें' को आबाद करने) आरंभ किया जा रहा

len = array.length; 
for (i = 0; i < len; i++) { 
    var record = array[i]; 

    if (typeof map[record.Colour] === 'undefined') 
     map[record.Colour] = {}; 

    map[record.Colour][record.Size] = record.Price; 
} 

5) समारोह updateSpan (चुनिंदा परिवर्तन पर):

function updateSpan() { 
    var Colour = selects.Colour.options[selects.Colour.selectedIndex].value; 
    var Size = selects.Size.options[selects.Size.selectedIndex].value; 

    if (typeof map[Colour] !== 'undefined' && typeof map[Colour][Size] !== 'undefined') 
     span.textContent = map[Colour][Size]; 
    else 
     span.textContent = "Price not defined to Colour: " + Colour + " and Size: " + Size + "."; 
} 

6) डिबगिंग (हिट F12 Chrome या Firefox में कंसोल देखें खोलने के लिए)।

पूर्ण अनुक्रमित तालिका:

console.log(map); 

बस 'ब्लू' & 'छोटे' की कीमत:

console.log(map['Blue']['Small']); // outputs: 45 
+0

धन्यवाद। ध्यान दें कि इस पंक्ति में टाइपो त्रुटि है >> 'मध्यम, << –

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