我有一个each
函数,它接受html td
的{{1}}元素并将它们放在一个对象数组中。我的问题是我只需要表中的唯一值。这导致我的数组具有重复值。理想情况下,我希望看到table
和Product
的唯一值。 valProduct
与“产品”基本相同。这是我的结束尝试:
valProduct
var array_return = [];
$(".table__product td:nth-child(1)").each(function() {
array_return.push({
"Product": $(this).html(),
"valProduct": $(this).html()
});
});
array_return.sort(function(a, b) {
return a.Product - b.Product;
});
// delete all duplicates from the array_return
for (var i = 0; i < array_return.length - 1; i++) {
if (array_return[i].Product == array_return[i + 1].Product) {
delete array_return[i];
}
}
// remove the "undefined entries"
array_return = array_return.filter(function(el) {
return (typeof el !== "undefined");
});
alert(JSON.stringify(array_return));
答案 0 :(得分:0)
我认为您可能最好将独特项目复制到新阵列而不是使用您正在使用的循环。这段代码的问题是:
for (var i = 0; i < array_return.length - 1; i++) {
if (array_return[i].Product == array_return[i + 1].Product) {
delete array_return[i];
}
}
是: 1)从数组中删除项目时(比如索引3处的项目)。索引4处的项目变为项目3,但是当您在循环中递增i时,它将检查索引4(以前是索引5)并且索引4永远不会被检查。我将其重写为:
var newArray = [];
newArray.push(array_return[0]);
for (var i = 1; i < array_return.length; i++) {
if (array_return[i].Product != array_return[i - 1].Product) {
newArray.push(array_return[i]);
}
}
array_return = newArray;
我不保证语法是完美的,但这绝对是个主意。
答案 1 :(得分:0)
错误是由于两件事造成的:
for
循环中的键您需要做的是在for
循环中定义一个新数组,而不是修改原始数组,然后将新数组分配给原始数组。
请参阅以下代码以获取示例:
var array_return = [];
var filtered_array = [];
var filtered_array_keys = [];
$(".table__product td:nth-child(1)").each(function() {
array_return.push({
"Product": $(this).html(),
"valProduct": $(this).html()
});
});
// delete all duplicates from the array_return
for (var i = 0; i < array_return.length - 1; i++) {
if (filtered_array_keys.indexOf(array_return[i].Product) < 0) {
filtered_array_keys.push(array_return[i].Product);
filtered_array.push(array_return[i]);
}
}
array_return = filtered_array;
// remove the "undefined entries"
array_return = array_return.filter(function(el) {
return (typeof el !== "undefined");
});
alert(JSON.stringify(array_return));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<table class="table__product">
<tr>
<td>Apple</td>
<td>3384</td>
<td>iPhone</td>
</tr>
<tr>
<td>Samsung</td>
<td>8800</td>
<td>Galaxy</td>
</tr>
<tr>
<td>LG</td>
<td>8684</td>
<td>V20</td>
</tr>
<tr>
<td>Google</td>
<td>8179</td>
<td>Pixel</td>
</tr>
<tr>
<td>Blackberry</td>
<td>4554</td>
<td>Storm</td>
</tr>
<tr>
<td>Motorolla</td>
<td>6764</td>
<td>Z force</td>
</tr>
<tr>
<td>LEASING_REVENUE</td>
<td NOWRAP align=RIGHT>-2100000</td>
</tr>
<tr>
<td>LEASING_REVENUE</td>
<td NOWRAP align=RIGHT>-2095011</td>
</tr>
<tr>
<td>LEASING_REVENUE</td>
<td NOWRAP align=RIGHT>-2095010</td>
</tr>
<tr>
<td>ECS/ACH</td>
<td align=RIGHT>4493</td>
</tr>
<tr>
<td>ECS/ACH</td>
<td align=RIGHT>4494</td>
</tr>
<tr>
<td>ECS/ACH</td>
<td align=RIGHT>4495</td>
</tr>
</table>
答案 2 :(得分:0)
var array_return = [];
$(".table__product td:nth-child(1)").each(function() {
var value = $(this).html();
// check if a product with value is already exist
var exist = array_return.find(function(e){
return e.Product == value;
});
// if exist, don't save
if(exist) return;
// else push it
array_return.push({
"Product": value,
"valProduct": value
});
});
// no need for more filtering.