遍歷對象並返回匹配的鍵/值 (Traverse object and return matching key / values)


問題描述

遍歷對象並返回匹配的鍵/值 (Traverse object and return matching key / values)

I have a series of objects containing product information that I need to use to filter the available product options. (i.e. Customer selects radio button with value option id 25, I need to filter the other two options based on what's available for id 25 and then get the value for that three part combination from configurations (25 / 1 / 13) and find that combination in siblings to return the sku value (25 / 1/ 13 = 1761).  

I've been successful at getting the keys and values but not matching.  I'm a total n00b with javascript (most of my experience is just animating things with jQuery) so I'm not sure that I have written anything worthwhile so far.

Here's what I get from the encoded JSON (trimmed b/c data is massive so formatting might not be exact).  I don't have any control over formatting and structure of the JSON.

  var configurations = {
        "lens_types":{
                "25":{
                      "1":1,
                      "2":2,
                      "4":4,
                      "3":3}},
            "lenses":{
                "25":{
                      "1":{
                            "2":2,
                            "4":4,
                            "5":5,
                            "6":6,
                            "9":9,
                            "13":13},
                       "2":{
                            "4":4,
                            "5":5,
                            "6":6,
                            "13":13}}}
  var siblings = { 
            "25":{
                  "1":{
                       "2":1744,
                       "4":1745,
                       "5":1747},
                       "6":1749,
                       "9":1752,
                       "13":1761},
                   "2":{
                       "4":1746,
                       "5":1748,
                       "6":1750,
                       "13":1762},
                   "4":{ 
                       "1":1753,
                       "3":1756,
                       "8":1759},
                   "3":{
                       "2":1754,
                       "3":1755,
                       "8":1757,
                       "9":1758,
                       "12":1760}}}

This is the generic structure of the product form: 

    <form method="post" action="" name="product_details">
        <div id="frame_style">          
            <input type="radio" name="frame_style" value="1" />
            <input type="radio" name="frame_style" value="3" />
            <input type="radio" name="frame_style" value="11" />
            <input type="radio" name="frame_style" value="24" />
            <input type="radio" name="frame_style" value="25" />
            <input type="radio" name="frame_style" value="27" />
            <input type="radio" name="frame_style" value="2" />
            <input type="radio" name="frame_style" value="8" />
            <input type="radio" name="frame_style" value="45" />
            <input type="radio" name="frame_style" value="77" />
            <input type="radio" name="frame_style" value="89" />
            <input type="radio" name="frame_style" value="13" />
        </div>
        <div id="lens_type">            
            <input type="radio" name="lens_type" value="1" />
            <input type="radio" name="lens_type" value="2" />
            <input type="radio" name="lens_type" value="3" />
            <input type="radio" name="lens_type" value="4" />
        </div>
        <div id="lens_style">           
            <input type="radio" name="lens_style" value="1" />
            <input type="radio" name="lens_style" value="2" />
            <input type="radio" name="lens_style" value="3" />
            <input type="radio" name="lens_style" value="4" />
            <input type="radio" name="lens_style" value="5" />
            <input type="radio" name="lens_style" value="8" />
            <input type="radio" name="lens_style" value="9" />
            <input type="radio" name="lens_style" value="12" />
        </div>
    </form> 

Any ideas?  Thanks!!

Edit

Here's the full object for both:

    var configurations = {"lens_types":{"25":{"1":1,"2":2,"4":4,"3":3},"1":{"1":1,"2":2,"4":4,"3":3},"15":{"1":1,"2":2,"3":3},"26":{"1":1,"2":2,"3":3},"24":{"1":1,"2":2,"4":4,"3":3},"27":{"1":1,"2":2,"4":4,"3":3},"11":{"1":1,"2":2,"4":4,"3":3},"3":{"1":1,"2":2,"4":4,"3":3}}, "lenses":{"25":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"4":{"1":1,"3":3,"8":8},"3":{"2":2,"3":3,"8":8,"9":9,"12":12}},"1":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"4":{"1":1,"3":3,"8":8},"3":{"2":2,"3":3,"8":8,"9":9,"12":12}},"15":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"3":{"2":2,"3":3,"8":8,"9":9}},"26":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"3":{"2":2,"3":3,"8":8,"9":9}},"24":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"4":{"1":1,"3":3,"8":8},"3":{"2":2,"3":3,"8":8,"9":9,"12":12}},"27":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"4":{"1":1,"3":3,"8":8},"3":{"2":2,"3":3,"8":8,"9":9,"12":12}},"11":{"1":{"2":2,"4":4,"5":5,"6":6,"9":9,"13":13},"2":{"4":4,"5":5,"6":6,"13":13},"4":{"1":1,"3":3,"8":8},"3":{"2":2,"3":3,"8":8,"9":9,"12":12}},"3":{"1":{"2":2,"4":4,"5":5,"9":9},"2":{"4":4,"5":5,"6":6},"4":{"1":1,"3":3,"8":8},"3":{"2":2,"3":3,"8":8,"9":9,"12":12}}}}

    var siblings = {"25":{"1":{"2":1744,"4":1745,"5":1747,"6":1749,"9":1752,"13":1761},"2":{"4":1746,"5":1748,"6":1750,"13":1762},"4":{"1":1753,"3":1756,"8":1759},"3":{"2":1754,"3":1755,"8":1757,"9":1758,"12":1760}},"1":{"1":{"2":1769,"4":1770,"5":1772,"6":1774,"9":1777,"13":1786},"2":{"4":1771,"5":1773,"6":1775,"13":1787},"4":{"1":1778,"3":1781,"8":1784},"3":{"2":1779,"3":1780,"8":1782,"9":1783,"12":1785}},"15":{"1":{"2":1794,"4":1795,"5":1797,"6":1799,"9":1802,"13":1807},"2":{"4":1796,"5":1798,"6":1800,"13":1808},"3":{"2":1803,"3":1804,"8":1805,"9":1806}},"26":{"1":{"2":1809,"4":1810,"5":1812,"6":1814,"9":1817,"13":1822},"2":{"4":1811,"5":1813,"6":1815,"13":1823},"3":{"2":1818,"3":1819,"8":1820,"9":1821}},"24":{"1":{"2":1824,"4":1825,"5":1827,"6":1829,"9":1832,"13":1841},"2":{"4":1826,"5":1828,"6":1830,"13":1842},"4":{"1":1833,"3":1836,"8":1839},"3":{"2":1834,"3":1835,"8":1837,"9":1838,"12":1840}},"27":{"1":{"2":1843,"4":1844,"5":1846,"6":1848,"9":1851,"13":1860},"2":{"4":1845,"5":1847,"6":1849,"13":1861},"4":{"1":1852,"3":1855,"8":1858},"3":{"2":1853,"3":1854,"8":1856,"9":1857,"12":1859}},"11":{"1":{"2":1862,"4":1863,"5":1865,"6":1867,"9":1870,"13":1879},"2":{"4":1864,"5":1866,"6":1868,"13":1880},"4":{"1":1871,"3":1874,"8":1877},"3":{"2":1872,"3":1873,"8":1875,"9":1876,"12":1878}},"3":{"1":{"2":1881,"4":1882,"5":1884,"9":1888},"2":{"4":1883,"5":1885,"6":1886},"4":{"1":1889,"3":1892,"8":1895},"3":{"2":1890,"3":1891,"8":1893,"9":1894,"12":1896}}}

參考解法

方法 1:

You could do something like:

$('#frame_style input:radio').click(function(){
    var val = $(this).val();
    for ( var ind in configurations['lenses'][val]){
       var input = '<input type="radio" name="lens_type" value="'+ind+'" >'+ind;
       $('#lens_type').append(input);
    }
});

$('#lens_type input:radio').live('click', function(){
    var frame = $('#frame_style input:radio:checked').val();
    var val = $(this).val();
    for ( var ind in configurations['lenses'][frame][val]){
               var input = '<input type="radio" name="lens_style" value="'+ind+'" >'+ind;
       $('#lens_style').append(input);
    }
});

$('#lens_style input:radio').live('click', function(){
    var frame = $('#frame_style input:radio:checked').val();
    var type = $('#lens_type input:radio:checked').val();
    var style = $(this).val()
        alert('Sku is:'+siblings[frame][type][style]);
});

the idea is to create the radios after the user select the first level. Of course this is very basic, you can try this fiddle: http://jsfiddle.net/LL3SM/ and choos 25, 1, 2 you will get an alert with the sku

(by MomoNicola Peluchetti)

參考文件

  1. Traverse object and return matching key / values (CC BY-SA 3.0/4.0)

#javascript #filtering #JSON #tree-traversal






相關問題

為什麼我不能在 IE8 (javascript) 上擴展 localStorage? (Why can't I extend localStorage on IE8 (javascript)?)

在 Javascript 中打開外部 sqlite3 數據庫 (Open external sqlite3 database in Javascript)

Javascript:數組中的所有對像都具有相同的屬性 (Javascript: All Objects in Array Have Same Properties)

為什麼我們要在 javascripts 原型中添加函數? (Why do we add functions to javascripts prototype?)

顯示 URL javascript 的最後一部分? (Display the last part of URL javascript?)

Javascript XMLHttpRequest:忽略無效的 SSL 證書 (Javascript XMLHttpRequest: Ignore invalid SSL Certificate)

有沒有辦法測試 console.log 整體 (Is there a way to test for console.log entires)

如何從 javascript 對像中獲取名稱和值到新列表中? (How to get name and values from a javascript object into a new list?)

數據未發布..幫助!html,js,firebase (Data not posting.. Help! html,js,firebase)

使用 Node.js 腳本查看表單數據 (Seeing form data with Node.js script)

使用百分比查找範圍內的值 (find the value within a range using percent)

如何通過 react.js 中的組件傳遞變量或數據? (How to pass varible or data through components in react.js?)







留言討論