2012-12-19 89 views
1

我有一個string,我分裂使用string.split(' ');爲了將字符串轉換爲數組。3維陣列Javascript

假設我有這兩個表,table1table2

<table border="1" id="table1"> 
    <tr> 
     <th colspan="2">Image One</th> 
    </tr> 
    <tr> 
     <td style="width:40%;"><img src="airplane.jpg" alt="Image 1"></td> 
     <td> 
      <dl> 
       <dt>airplane</dt> 
       <dt>flight</dt> 
       <dt>travel</dt> 
       <dt>military</dt> 
       <dt>word war</dt> 
       <dt>GI</dt> 
      </dl> 
     </td> 
    </tr> 
</table> 

<table border="1" id="table2"> 
    <tr> 
     <th colspan="2">Image Two</th> 
    </tr> 
    <tr> 
     <td style="width:40%;"><img src="apple.jpg" alt="Image 1"></td> 
     <td> 
      <dl id="tags"> 
       <dt>red</dt> 
       <dt>apple</dt> 
       <dt>round</dt> 
       <dt>fruit</dt> 
       <dt>healthy</dt> 
       <dt>doctor</dt> 
      </dl> 
     </td> 
    </tr> 
</table> 

現在用於測試目的我有tagstable2dl的ID。

我用一個函數把這一DL(#tags)到一個數組

function getArray(id) { 
var node, list, arrValue; 

    array = []; 
    for (node = document.getElementById(id).firstChild; 
     node; 
     node = node.nextSibling) { 
     if (node.nodeType == 1 && node.tagName == 'DT') { 
      array.push(node.innerHTML); 
     } 
    } 
    console.log(array) 
} 

,以檢查它,我原來string,看是否有任何值匹配的。 但是,我將有多個DTstring將被檢查。將所有表格添加到3d數組中是否正確,然後檢查string中的數值與3d數組?還是有更好的方法?

UPDATE

的問題是:

我最終將擁有一個充滿圖像和標籤表。基本上我想能夠搜索那些標籤對我的字符串(這將分離成一個數組),然後返回字符串中標籤最多的圖像。我試圖找出最好的方法來做到這一點。 謝謝

+0

這看起來並不像一個很好的使用情況'

單曲 – Bergi

+0

你所說的「3D陣列」是什麼意思?另外,請發佈你的整個'dl-to-array'函數。 – Bergi

+0

回顧一下:你正在從一個字符串中創建一個數組,然後你想要將這些數組值與頁面上已有的值進行比較?你打算使用jQuery嗎? –

回答

1

你不會使用三維陣列,但僅一個二維一個與表和他們的標籤。或者,如參宿一已經提到的,甚至更好的查找對象:

var map = {}; 
var dls = document.getElementsByTagName('dl'); 
for (var i = 0, i < dls.length; i++) { 
    var tableid = dls[i].id; // identifier? 
    var dts = dls[i].getElementsByTagName('dt'); // assuming you don't nest them 
    for (var j = 0; j < dts.length; j++) { 
     var text = dts[j].textContent || dts[i].innerText; 
     var tags = text.split(/\s+/); 
     for (var k=0; k<tags.length; k++) 
      if (tags[k] in map) 
       map[tags[k]].push(tableid); 
      else 
       map[tags[k]] = [tableid]; // an array 
    } 
} 
/* now, map could look like this: 
{ 
    word: ["table1"], 
    war: ["table1"], 
    red: ["table2"], 
    double: ["table1", "table2"], // tags in more than one table 
    … 
} 
*/ 

要獲得字符串中的大多數代碼表,你現在可以使用這樣的功能,它返回標籤occurence排序各自tableids:

function getHighestTables(string) { 
    var tags = string.split(/\s+/); 
    var tablecounts = {}; 
    for (var i=0; i<tags.length; i++) { 
     var tables = map[tags[i]] || []; 
     for (var j=0; j<tables.length; j++) { 
      var tableid = tables[j]; 
      if (tableid in tablecounts) 
       tablecounts[tableid]++; 
      else 
       tablecounts[tableid] = 1; 
     } 
    } 
/* tablecounts might now look like this: 
    { 
     table1: 2 
     table2: 5 
    } 
*/ 
    return Object.keys(tablecounts).sort(function (a, b) { 
     return tablecounts[b] - tablecounts[a]; 
    }); 
} 
+0

感謝您的輸入,我將如何使用這個與我的HTML? –

+0

如果您檢查控制檯,我將所有內容移到了jsfiddle.net/J4kF9/上,但出現錯誤 –

+0

感謝提示,我修復了這些錯誤。更新到http://jsfiddle.net/J4kF9/1/,輸出表示表2中的句子比表1中的更多標籤 – Bergi

3

而不是一個數組,我會使用Object來存儲標籤列表,其中鍵是標籤和值是不相關的。

如果您使用的是array.indexOf(),這會給您O(1)查找來檢查該列表中是否存在其他字符串,而不是O(n)查找。

下面的函數將查找頁面上的每個DT,然後將包含每個DT文本的映射的對象返回到其父DL的ID。

function makeMap() { 
    var map = {}; 
    var dls = document.getElementsByTagName('DL'); 
    for (var i = 0, n = dls.length; i < n; ++i) { 
     var dl = dls[i]; 
     var id = dl.id; 
     var node = dl.firstChild; 
     while (node) { 
      if (node.nodeType == 1 && node.tagName == 'DT') { 
       var tag = node.textContent || node.innerText; // latter for MSIE 
       map[tag] = id; 
      } 
      node = node.nextSibling; 
     } 
    } 
    return map; 
} 

或者,jQuery中(與混合效率在一些純JS):

function makeMap2() { 
    var map = {}; 
    var $dt = $('dl > dt'); 
    $dt.each(function() { 
     var tag = this.textContent || this.innerText; 
     map[tag] = this.parentNode.id; 
    }); 
    return map; 
} 
+0

我猜測值應該是包含標籤的表格,因爲OP似乎在搜索它們。 – Bergi

+0

@Bergi如果你喜歡,是的,如果每個標籤只能出現在一個表中,那麼你可以使用這些值來表示哪一個。 – Alnitak

+0

@Alnitak你能舉個例子嗎? –