我正在使用'jQuery.unique()'函数将不同的数组值从一个数组放到另一个数组中,但第二个数组中的值似乎不包含不同的值。
var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126'];
uniqueArray = $j.unique(nonuniqueArray);
alert (uniqueArray);
提醒的值为:AMI:29126,AMI:31591,AMI:29126,AMI:8244
我注意到如果数组中的相似值组合在一起,那么它工作正常,例如,如果'AMI:29126'组合在一起,似乎没问题。
对上述代码有什么问题的任何建议都是最受欢迎的。
非常感谢:)
答案 0 :(得分:4)
不会为此创建$ .unique,请参阅以下网址:http://api.jquery.com/jQuery.unique/
$ .unique()函数搜索对象数组,进行排序 数组,并删除任何重复的节点。 此功能仅适用 在DOM元素的纯JavaScript数组上,主要使用 在内部由jQuery。
你可以做的是先将它排序然后使用唯一的,这不是它的确切位置,但它有效。
var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126'];
var sortedArray = Array.sort(nonuniqueArray );
var unique = $.unique(sortedArray);
$.each(unique , function(k, v){
$("div").append(v + "<br />");
});
结果:
AMI:8244
AMI:31591
AMI:29126
答案 1 :(得分:3)
这里是如何使用常规Array方法执行此操作的,但我会注意到indexOf()是一种较新的数组方法,并且在IE7或更早版本中无法工作,但很容易通过1循环重复< / p>
var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126'];
function distinctVal(arr){
var newArray = [];
for(var i=0, j=arr.length; i<j; i++){
if(newArray.indexOf(arr[i]) == -1)
newArray.push(arr[i]);
}
return newArray;
}
var uniqueArray = distinctVal(nonuniqueArray);
alert(uniqueArray);
答案 2 :(得分:1)
您不能对字符串数组使用jQuery unique
方法。它只适用于DOM元素的数组。来自docs:
在适当的位置对DOM元素数组进行排序,并删除重复项。 请注意,这仅适用于DOM元素的数组,而不适用于字符串或 号。
答案 3 :(得分:0)
这是一个比Marlin解决方案更高效和兼容的示例。 indexOf
对大型数组的查找有点昂贵,因此对于字符串来说,创建临时对象要好得多:
function strUnique(arr) {
var obj = {},
ret = [],
i = arr.length;
while (i--) {
if (!obj[arr[i]]) {
obj[arr[i]] = true;
ret.unshift(arr[i]);
}
}
return ret;
}
如果订单很重要,您可能希望向前工作而不是向后工作。如果是这样,你需要相应地调整循环。
答案 4 :(得分:0)
在ES6中你可以这样做:
Array.prototype.unique = function() {
let newArray = [];
for(let i=0, j=this.length; i<j; i++){
if(newArray.indexOf(this[i]) == -1) newArray.push(this[i]);
}
this.splice(0, this.length, ...newArray);
}
然后按yourarray.unique()
运行它(它在原地工作)。如果您不使用ES6,可以用以下代码替换它:this.splice(0, this.length, ...newArray);
(我不测试下面的代码):
this.splice(0, this.length)
for(el of newArray) { this.push(el) }