2012-12-19 87 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你能举个例子吗? –