使用.each()函数后,从对象数组中删除重复值

时间:2017-01-18 17:50:18

标签: javascript jquery html arrays

我有一个each函数,它接受html td的{​​{1}}元素并将它们放在一个对象数组中。我的问题是我只需要表中的唯一值。这导致我的数组具有重复值。理想情况下,我希望看到tableProduct的唯一值。 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));

3 个答案:

答案 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)

错误是由于两件事造成的:

  1. 已排序数组的值未分配回任何位置
  2. 您正在通过删除for循环中的键
  3. 来修改阵列

    您需要做的是在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.