【问题标题】:Pushing arrays into another array without duplicate values将数组推入另一个数组而没有重复值
【发布时间】:2016-05-05 10:21:29
【问题描述】:

我在每个循环中有一个每个循环:

var data_array = [];

$('td.form').each(function(){

    $(this).children('input[type=hidden]').each(function(index, element){
        var name  = $(element).attr('name');
        data_array[index] = $(element).val();
    });

    console.log(data_array);

});

第一个循环遍历包含一组隐藏输入的特定表格单元格。

我已经设法将隐藏输入中的数据收集到数组中。当我在每次迭代时写信给控制台时,我得到了这个:

[id: "56a8382bd5b88", date: "Tuesday, February 16th, 2016 - 10:00 PM UTC", waiting_list: "false"]
[id: "56a9260e14b3e", date: "Tuesday, February 23rd, 2016 - 5:00 PM UTC", waiting_list: "true"]

我想要做的是将这些数组写入一个新的数组或对象,以便稍后在脚本中使用这样的东西:

myNewArray = [
    first = [ /* 'first' as placeholder text */
        id: "56a8382bd5b88", 
        date: "Tuesday, February 16th, 2016 - 10:00 PM UTC", 
        waiting_list: "false"
    ],
    second = [ /* 'second' as placeholder text */
        id: "56a9260e14b3e", 
        date: "Tuesday, February 23rd, 2016 - 5:00 PM UTC",  
        waiting_list: "true"
    ]
]

我一直在尝试创建一个新数组并使用 push:

var data_array = [];
var myOtherNewArray = [];

$('td.form').each(function(){

    $(this).children('input[type=hidden]').each(function(index, element){
        var name  = $(element).attr('name');
        data_array[index] = $(element).val();
    });

    console.log(data_array);
    myOtherNewArray.push(data_array);

});

console.log(myOtherNewArray);

但这一直给我不想要的重复:

myOtherNewArray = [
    first = [
        id: "56a9260e14b3e",
        date: "Tuesday, February 23rd, 2016 - 5:00 PM UTC", 
        waiting_list: "true"
    ],
    second = [
        id: "56a9260e14b3e", 
        date: "Tuesday, February 23rd, 2016 - 5:00 PM UTC",  
        waiting_list: "true"
    ]
]

显然我正在覆盖循环中的数据。我似乎无法在这里找出正确的构造。任何帮助将不胜感激!

【问题讨论】:

  • 你从哪里得到'first''second'这个词?
  • 你能用html部分创建一个jsFiddle吗?
  • @NinaScholz,“first”和“second”这两个词只是占位符(即第一个数组、第二个数组等)
  • 也许你在推送值之前清除数组。代码未显示问题发生的位置。

标签: javascript jquery arrays loops each


【解决方案1】:

这是我对 JavaScript Array 原型所做的一些扩展的 sn-p ... 希望对您有所帮助。它是一个 Array.contains(item, [property]) 函数。

//returns boolean showing whether array contains an item, or if one of its 
//properties (arr[i].prop) is equal to item
Array.prototype.contains = function (item, prop) {
   var arr = this;
   if (prop == undefined || prop == null) {
       for (var i = 0; i < arr.length; i++) {
           if (arr[i] == item) {
               return true;
           }
       }
   }
   else {
       for (var i = 0; i < arr.length; i++) {
           if (arr[i][prop] == item) return true;
       }
   }
   return false;
}

这样,我相信您可以检查数组是否包含原始对象,或者具有具有特定值的属性的对象。

如果你想检查一个数组是否包含数字 5,Array.indexOf(5) 可以轻松处理,

var arr = [1,2,3,4,5];
console.log(arr.indexOf(5));

如果您想检查数组是否包含具有属性的对象

var arr = [{name: "john", age: 11},{name: "paul", age: 11}];
console.log(arr.contains("paul", "name"));

这会将 TRUE 打印到控制台。

编辑:为了确保数组不包含重复值,您需要一个属性作为键,在您的情况下,我认为是属性“id” 因此,在遍历数组时,请检查结果数组是否包含“id”值与迭代项相同的项。

【讨论】:

  • 你为什么把代码过于复杂化?为什么不依赖 indexOf 完成的(优化的)搜索并返回 index &gt;= 0?为什么使用等于,而不是严格等于?如果我的数组同时包含 "0"0 作为值,则会导致您的解决方案失败。
  • 好吧,我写了那段代码,但我没有编辑它,除非我进行调整。下次我来编辑它时,我会确保使用 indexOf。而且我非常喜欢 javascript 的松散性,所以“0”对我来说与 0 相同。
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2013-01-14
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多