2014-10-30 22 views
0

我有這個HTML表中創建鍵=>值數組:如何在收集對象的Javascript

<table class="table table-condensed"> 
    <thead> 
     <tr> 
      <th><input type="checkbox" id="toggleCheckboxSelFabricante" name="toggleCheckboxSelFabricante"></th> 
      <th>Fabricante</th> 
     </tr> 
    </thead> 
    <tbody id="selFabricanteBody"> 
     <tr> 
      <td><input type="checkbox" name="selChkFabricante" id="selChkFabricante3" value="3"></td> 
      <td>Eos est ipsam.</td> 
     </tr> 
    </tbody> 
</table> 

我需要創建一個key => valuemanufacturerColl變種,其中id是每個選中的複選框(值第一個在桌子上)和name是第二列的文字,但不知道如何。這是我在我的代碼已經:

var checkedModelBranch = $("#parMarcaModeloFabricanteBody").find("input[type='checkbox']:checked"), 
       checkedManufacturers = $("#selFabricanteBody").find("input[type='checkbox']:checked"), 
       manufacturerColl = [], 
       modelBranchManufacturerCollection; 


     for (var j = 0; j < checkedManufacturers.length; j++) { 
      manufacturerColl.push(checkedManufacturers[j].value); 
     } 

     for (var i = 0; i < checkedModelBranch.length; i++) { 
      modelBranchManufacturerCollection = addNewRelationModelBranchManufacturer(checkedModelBranch[i].value, manufacturerColl); 
      if (modelBranchManufacturerCollection) { 
       for (var k = 0; k < modelBranchManufacturerCollection.manufacturerKeyCollection.length; k++) { 
        $("#parMarcaModeloFabricanteBody td#" + checkedModelBranch[i].value).html(modelBranchManufacturerCollection.manufacturerKeyCollection[k] + '<br/>'); 
       } 
      } 
     } 

我需要在別人的話是每個manufacturerColl已經和id =>name,例如:

manufacturerColl[] = { 
    id: someId, 
    name: someName 
}; 

而且我不知道,但也許這可以工作:

// move foreach selected checkbox and get the needed 
    for (var j = 0; j < checkedManufacturers.length; j++) { 
     manufacturerColl.push({ 
      id: checkedManufacturers[j].value, 
      name: "" // how do I get the value on the second column? 
     }); 
    } 

這是正確的方法來做到這一點?如何在每次迭代中獲得第二列的值?

方法

我不知道這是否是完全性右,但我做了什麼,它是越野車。請參閱代碼:

var checkedModelBranch = $("#parMarcaModeloFabricanteBody").find("input[type='checkbox']:checked"), 
       checkedManufacturers = $("#selFabricanteBody").find("input[type='checkbox']:checked"), 
       // I added this var to get all the names 
       checkedManufacturersName = $("#selFabricanteBody").find("input[type='checkbox']:checked").parent().next('td').text(), 
       manufacturerColl = [], 
       modelBranchManufacturerCollection; 


     for (var j = 0; j < checkedManufacturers.length; j++) { 
      manufacturerColl.push({ 
       id: checkedManufacturers[j].value, 
       // Here I'm tying to put the entire name but get only the first character 
       name: checkedManufacturersName[j] 
      }); 
     } 

     for (var i = 0; i < checkedModelBranch.length; i++) { 
      modelBranchManufacturerCollection = addNewRelationModelBranchManufacturer(checkedModelBranch[i].value, manufacturerColl); 
      if (modelBranchManufacturerCollection) { 
       //$("#parMarcaModeloFabricanteBody td#" + checkedModelBranch[i].value).siblings().attr("rowspan", modelBranchManufacturerCollection.manufacturerKeyCollection.length); 

       for (var k = 0; k < modelBranchManufacturerCollection.manufacturerKeyCollection.length; k++) { 
        // then I render the name attribute from the collection 
        $("#parMarcaModeloFabricanteBody td#" + checkedModelBranch[i].value).append((modelBranchManufacturerCollection.manufacturerKeyCollection)[k].name + '<br/>'); 
       } 
      } 
     } 

爲什麼我只插入/獲取第一個字符而不是完整的字符串?

+0

@apsillers我在主文章中添加了一些額外的信息,請看一下,看看是否清除了一些問題以及我需要的內容 – ReynierPM 2014-10-30 20:46:47

+0

如果您的意思是HTML中複選框旁邊的文本,它的正文。沒有辦法輕鬆搞定。你可以將它封裝在一個帶有id的跨度中,或者像'['text1','text2']'那樣硬編碼地圖,其中數組索引是複選框值(稀疏數組是javascript處理的少數幾個東西之一),以及當你迭代選中的複選框時,只需從該數組中取出'name'值即可。 – 2014-10-30 20:50:20

+0

@JaredSmith,按照你的建議做,我該怎麼做? – ReynierPM 2014-10-30 20:51:54

回答

1

//由於您的輸入和文字被包裹在TD元素

在代碼:

var checked = $('#selFabricanteBody').find('input[type="checkbox"]:checked'); 
var arr = [], j = checked.length, item; 

while(j--) { 
    item = list[j]; 
    //gets the text from the next child, assumes its the text 
    //if the text is before checkbox, use previousSibling 
    arr.push({id: item.value, name: item.parentNode.nextSibling.nodeValue}); 
} 
+0

我無法更改HTML結構,任何其他解決方法? – ReynierPM 2014-10-30 21:00:35

+0

對不起,我在主要帖子上打了一個錯字,並且沒有顯示所有包裝的表格 – ReynierPM 2014-10-30 21:01:33

+0

更新了我的答案 – 2014-10-30 21:15:50

0

這是我用它來創建一個對象,發送到正在尋找一個控制器方法作爲參數的類別/型號:

function ExtractModel(array) { 
var modelString = ''; 
var model = {}; 
//var array = arrayString.split('&'); 
var isObjectModel = $.isPlainObject(array); 
if (!isObjectModel) { 
    $(array).each(function (index, element) { 
     var typeId = element.split('=')[0]; 
     var val = element.split('=')[1]; 
     if (element == null) { } else { 
      model[typeId] = (val); 
     } 
    }); 
} else { 
    model = array; 
} 
return model; 

};

因此,我用一個url參數字符串並從中創建一個對象;參數字符串是從序列化表單生成的。 「模型」自動創建由「typeId」表示的屬性;如果「typeId」=「hello」,那麼將會創建一個新的屬性或對象項目,命名爲「hello」(model.hello會給你一個值)。您可以使用相同的邏輯來遍歷頁面上的元素以使用倍數填充對象。確保將變量「modelBranchManufacturerCollection」設置爲等於{},然後設置要插入新變量的位置的索引。

這應該做你想要什麼:

var ids = [1, 2, 3, 4, 5, 6] 
var names = ['a', 'b', 'c', 'd', 'e', 'f'] 

var mainObj = {}; 

$(ids).each(function (index, element) { 
    var miniObj = {}; 
    miniObj['id'] = ids[index]; 
    miniObj['name'] = names[index]; 
    mainObj[index] = miniObj; 
}); 

回報6項ID和姓名。