jQuery中是否有类似于array_unique()的函数?

9

我有一个选择器,可以将一些值作为数组获取,例如["1","2","3"]

每次更改时,我运行以下代码,以获取与我从选择器中获取的这些值相关联的数组结果。

$('#event-courses-type').on('change',function(){

    type = $('#event-courses-type').val();

    console.log(type);

    var var1 = ["4689 Leadership Award", "UKCC Level 1", "UKCC Level 2", "UKCC Level 3", "UKCC Level 4", "Old WHU Award", "None at present"];
    var var2 = ["4689 Leadership Award", "GB-wide Level 1", "Old Level 1 (Pre January 2012)", "Level 2", "Level 3", "EHF", "FIH", "None at present"];

    var var5 = ["D32/33", "A1 Assessor", "CTS", "IAPS", "PTLLS", "AVRA", "Umpire Educator Training", "Umpire Assessor Training"];
    var var6 = ["D32/33", "A1 Assessor", "CTS", "IAPS", "PTLLS", "AVRA", "Umpire Educator Training", "Umpire Assessor Training"];

    var results = [];

    if ($.inArray("1",type) != -1) {
        var results = $.merge(var1, results);
    }
    if ($.inArray("2",type) != -1) {
        var results = $.merge(var2, results);
    }
    if ($.inArray("5",type) != -1) {
        var results = $.merge(var5, results);
    }
    if ($.inArray("6",type) != -1) {
        var results = $.merge(var6, results);
    }

    console.log(results);
)};

这是我的控制台日志,让你看到我在选择了两个选项后的类型数组和结果数组:
["1", "2"] ------------------- add_event.php:802

["4689 Leadership Award", "GB-wide Level 1", "Old Level 1 (Pre January 2012)", "Level 2", "Level 3", "EHF", "FIH", "None at present", "4689 Leadership Award", "UKCC Level 1", "UKCC Level 2", "UKCC Level 3", "UKCC Level 4", "Old WHU Award", "None at present"]

您看到了 "4689 Leadership Award" 这个值出现了两次,我不希望这种情况发生。在 PHP 中,我使用 array_unique() 函数来消除这些重复的值,但我不知道如何在 jQuery 中实现。


jQuery没有一个可以做到这一点的方法。然而,使用简单的for循环或几种数组方法肯定可以实现这一点。 - Kevin B
2
我有一个问题,type是一个值,所以它显然是一个字符串,但你在$.inArray中将其用作数组,这是如何工作的? - adeneo
它能够工作是因为字符串也有一个indexOf方法。代码似乎没有意义,但基于indexOf的结果,它肯定会做“某些事情”,而每种类型所选择的结果都不同。它几乎看起来好像inArray根本不需要,应该只需将字符串值与字符串进行比较即可。 - Kevin B
@KevinB - 我已经测试过了,所以我知道它实际上可以像jQuery调用indexOf一样工作,我只是想知道OP是否知道他为什么在字符串上使用$.inArray,显然这不是它的预期用途。 - adeneo
在PHP中,array_unique函数保留键值。它不仅仅是删除重复项。这与仅删除重复条目的答案不同。这个问题不应该被关闭,因为目前还没有像PHP中的array_unique函数那样保留键值的答案。 - undefined
1个回答

23

尝试这个:

function unique(array){
  return array.filter(function(el, index, arr) {
      return index == arr.indexOf(el);
  });
}

working example:

const startingArray = [1, 2, 2, 3, 2, 3, 3, 3];

function unique(array){
  return array.filter(function(el, index, arr) {
      return index == arr.indexOf(el);
  });
}

const uniqueArray = unique(startingArray);

console.log(uniqueArray);


1
好的回答。我喜欢它。我尝试找更多,但你的回答已经满足了我的需求。 - Ashish4434
一个检查对象数组中唯一性的好技巧是,在使用该函数之前,您可以将其转换为向量:const genres = this.state.movies.map(movie => movie.genre); const uniqueGenres = genres.filter((genre, index, arr) => index == arr.indexOf(genre)); return uniqueGenres; - Renan Coelho
1
@RenanCoelho 的答案是正确的,但可以简写成这样:this.state.movies.map(e=>e.genre).filter((e, i, a) => i === a.indexOf(e)) - Moisés Márquez
可以,但我更喜欢代码尽可能易读,而不是简短。 - Nagy Nick
请注意,此方法不会更改传递的数组,因此您应该像这样调用它:array = unique(array); - Boolean_Type
这个具有二次时间复杂度O(n²)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接