根据值

时间:2018-03-09 16:29:16

标签: javascript php html

我有一个我想要阅读的html表,并通过阅读第一个表在其下创建一个新表。第一个表格如下:

ID |值

100 | 3

200 | 2

400 | 7

100 | 4

并应输出此

ID |总

100 | 7

200 | 2

400 | 7

我在第一行之后创建新行并根据ID添加它们时遇到了问题,这是我到目前为止所拥有的

var id = document.getElementByID("total");
var td = document.createElement('td');
var eleName = document.getElementsByName('initValue');
var total = 0;
for (var i = 1; i < eleName.length; i++) {
    total += parseInt(eleName[i].value);
}
td.textContent = total;
id.appendChild(td);

现在它只是添加所有值

ID只能增加100,并且只能有100-400个以上的条目。初始表是用php制作的

原始表格html

<table>
<tr><th>ID</th><th>Value</th></tr>
<tr><td name="itin" id="itin">100</td><td id="initValue" name="initValue">3</td></tr>
<tr><td name="itin" id="itin">200</td><td id="initValue" name="initValue">2</td></tr>
<tr><td name="itin" id="itin">400</td><td id="initValue"name="initValue">7</td></tr>
<tr><td name="itin" id="itin">100</td><td id="initValue" name="initValue">4</td></tr>
</table>

2 个答案:

答案 0 :(得分:0)

正如一些人在评论中所说,元素ID<el id="something">必须是唯一的,并且页面上不能有任何重复。如果你想&#34; group&#34;类似的元素使用一个类。

为了解决您的问题,由于您的ID值是直接兄弟,我们只需要一个选择器来获取ID和值:

const itin = document.querySelectorAll('[name="itin"]');

有了这个,我们可以遍历每个ID元素name="itin",并使用el.nextElementSibling.textContent获取值。我们将在对象中跟踪我们的ID和值,因为javascript没有键/值对数组:let values = {}

我们使用.nextElementSibling忽略空格,只获取下一个元素。

我们检查values是否已经使用hasOwnProperty记录了我们的ID,如果有,我们将这些值一起添加,如果不是,我们会在values中使用我们的ID创建一个属性并给它一个值:

if (values.hasOwnProperty(inner)) {
  values[inner] = values[inner] += parseInt(next);
} else {
  values[inner] = parseInt(next);
}

接下来,我们创建第二个循环来迭代values中的所有属性,并使用它构建我们的新表,其余的非常简单。

这两个循环可能会组合成一个具有更多逻辑的循环来搜索匹配的ID。

&#13;
&#13;
const itin = document.querySelectorAll('[name="itin"]');
let values = {};

itin.forEach(item => {
  const inner = item.textContent;
  let next = null;
  /* For direct sibling use this */
  //const next = item.nextElementSibling.textContent;
  
  /* For an unknown sibling use this */
  for ( let a = 0; a < item.parentElement.children.length; a++ ) {
    const n = item.parentElement.children[a];
    if ( n.getAttribute('name') === 'initValue') {
      next = n;
    }
  }
  next = next.textContent;
  /****/
  if (values.hasOwnProperty(inner)) {
    values[inner] = values[inner] += parseInt(next);
  } else {
    values[inner] = parseInt(next);
  }
});

const table_two = document.querySelector('.table-two tbody');

for (let prop in values) {
  const val = values[prop];
  let tr = document.createElement('tr');
  let td1 = document.createElement('td');
  let td2 = document.createElement('td');
  td1.innerHTML = prop;
  td2.innerHTML = val;
  tr.appendChild(td1);
  tr.appendChild(td2);
  table_two.appendChild(tr);
}
&#13;
<table>
  <tr>
    <th>ID</th>
    <th>Value</th>
  </tr>
  <tr>
    <td name="itin">100</td>
    <td name="initValue">3</td>
  </tr>
  <tr>
    <td name="itin">200</td>
    <td name="initValue">2</td>
  </tr>
  <tr>
    <td name="itin">400</td>
    <td name="initValue">7</td>
  </tr>
  <tr>
    <td name="itin">100</td>
    <td name="initValue">4</td>
  </tr>
</table>

<table class="table-two">
  <thead>
    <tr>
      <th>ID</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody></tbody>
</table>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

基于您提供的内容的完整JavaScript解决方案可在this jsfiddle

上找到

&#13;
&#13;
var tds = document.getElementsByName("itin"); 
var tdDict = {};
var keys = [];
for(var i=0;i<tds.length;i++){
	var tdId = tds[i];
  var tdVal = tds[i].nextSibling;
  if(tdId.textContent in tdDict){
  	 var curTotal = tdDict[tdId.textContent];
     var newTotal = curTotal + parseInt(tdVal.textContent);
     tdDict[tdId.textContent] = newTotal;
  }
  else{
  	tdDict[tdId.textContent] = parseInt(tdVal.textContent);
     keys.push(tdId.textContent);
  }
}
var totalDiv = document.getElementById("totals");
var totalTable = document.createElement("table");
totalDiv.append(totalTable);
var hrow = document.createElement("tr");
var idHeader = document.createElement("th");
idHeader.textContent = "ID";
var totalHeader = document.createElement("th");
totalHeader.textContent = "Total";
totalTable.append(hrow);
hrow.append(idHeader);
hrow.append(totalHeader);
for(var i=0;i<keys.length; i++){
		var newRow = document.createElement("tr");
    
		var idVal = keys[i];
    var valVal = tdDict[idVal];
    var idValTd = document.createElement("td");
    idValTd.textContent = idVal;
    var valValTd = document.createElement("td");
    valValTd.textContent = valVal;
    newRow.appendChild(idValTd);
    newRow.appendChild(valValTd);
    totalTable.appendChild(newRow); 
}
&#13;
<table>
<tr><th>ID</th><th>Value</th></tr>
<tr><td name="itin" id="itin">100</td><td id="initValue" name="initValue">3</td></tr>
<tr><td name="itin" id="itin">200</td><td id="initValue" name="initValue">2</td></tr>
<tr><td name="itin" id="itin">400</td><td id="initValue"name="initValue">7</td></tr>
<tr><td name="itin" id="itin">100</td><td id="initValue" name="initValue">4</td></tr>
</table>

<div id="totals">

</div>
&#13;
&#13;
&#13;