我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在Stack Overflow上找到了另一个脚本,看起来几乎与它完全一样,但它不会失败。

所以为了帮助我学习,有人能帮我确定原型脚本哪里出错吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重复问题的更多答案:

从JS数组中删除重复值

类似的问题:

获取数组中的所有非唯一值(即:重复/多次出现)


当前回答

要删除重复项,可能有两种情况。首先,所有数据都不是对象,其次所有数据都是对象。

如果所有数据都是任何类型的原始数据类型,如int、float、string等,那么您可以遵循以下一种

const uniqueArray = [...new Set(oldArray)]

但假设您的数组包含以下JS对象

{
    id: 1,
    name: 'rony',
    email: 'rony@example.com'
}

然后,要获取所有唯一的对象,可以执行以下操作

let uniqueIds = [];
const uniqueUsers = oldArray.filter(item => {
    if(uniqueIds.includes(item.id)){
        return false;
    }else{
        uniqueIds.push(item.id);
        return true;
    }
})

您也可以使用此方法使任何类型的数组成为唯一的。只需将跟踪键保留在uniqueIds数组上。

其他回答

在ES6/以后

仅获取唯一值

  let a = [
           { id: 1, name: "usman" },
           { id: 2, name: "zia" },
           { id: 3, name: "usman" },
          ];
const unique = [...new Set(a.map((item) => item.name))];
console.log(unique); // ["usman", "zia"]

获取唯一对象

const myObjArray = [
                       { id: 1, name: "usman" },
                       { id: 2, name: "zia" },
                       { id: 3, name: "usman" },
                   ];
// Creates an array of objects with unique "name" property values.
let uniqueObjArray = [
  ...new Map(myObjArray.map((item) => [item["name"], item])).values(),
];

console.log("uniqueObjArray", uniqueObjArray);

永远记住,内置方法易于使用。但请记住,它们具有复杂性。

基本逻辑是最好的。没有隐藏的复杂性。

let list = [1, 1, 2, 100, 2] // your array
let check = {}
list = list.filter(item => {
    if(!check[item]) {
        check[item] = true
        return true;
    }
})

或使用,如果您需要将来遍历检查项(但会浪费内存),则使用check=[]

使用字段[2]作为Id,创建唯一数组数组:

常量arr=[['497','Q0','WTX091-B06-138','0','1.000000','GROUP001'],['497','Q0','WTX091-B09-92','1','0.866899288','GROUP001'],['497','Q0','WTX091-B09-92','2','0.846036819','GROUP001'],['497','Q0','WTX091-B09-57','3','0.835025326','GROUP001'],['497','Q0','WTX091-B43-79','4','0.765068215','GROUP001'],['497','Q0','WTX091-B43-56','5','0.764211464','GROUP001'],['497','Q0','WTX091-B44-448','6','0.761701704','GROUP001'],['497','Q0','WTX091-B44-12','7','0.761701704','GROUP001'],['497','Q0','WTX091-B49-128','8','0.747434800','GROUP001'],['497','Q0','WTX091-B18-17','9','0.746724770','GROUP001'],['497','Q0','WTX091-B19-374','10','0.733379549','GROUP001'],['497','Q0','WTX091-B19-344','11','0.731421782','GROUP001'],['497','Q0','WTX091-B09-92','12','0.726450470','GROUP001'],['497','Q0','WTX091-B19-174','13','0.712757036','GROUP001']];arr.filter((val1,idx1,arr)=>~val1.indexOf(val1[2])&&!(arr.filter((val2,idx2)=>~val2.indexOf(val1[2])&&idx2<idx1).长度));控制台日志(arr);

下面是另一种使用比较器的方法(我更关心干净的代码而不是性能):

const list = [
    {name: "Meier"},
    {name: "Hans"},
    {name: "Meier"},
]
const compare = (a, b) => a.name.localeCompare(b.name);
const uniqueNames = list.makeUnique(compare);
uniqueNames.pushIfAbsent({name: "Hans"}, compare);

原型声明:

declare global {
    interface Array<T>  {
        pushIfAbsent(item: T, compare:(a:T, b:T)=>number): number;
    }
    interface Array<T>  {
        makeUnique(compare:(a:T, b:T)=>number): Array<T>;
    }
}
Array.prototype.pushIfAbsent = function <T>(this:T[], item:T, compare:(a:T, b:T)=>number) {
    if (!this.find(existing => compare(existing, item)===0)) {
        return this.push(item)
    } else {
        return this.length;
    }
}
Array.prototype.makeUnique = function <T>(this:T[], compare:(a:T, b:T)=>number) {
    return this.filter((existing, index, self) => self.findIndex(item => compare(existing, item) == 0) == index);
}
["Defects", "Total", "Days", "City", "Defects"].reduce(function(prev, cur) {
  return (prev.indexOf(cur) < 0) ? prev.concat([cur]) : prev;
 }, []);

[0,1,2,0,3,2,1,5].reduce(function(prev, cur) {
  return (prev.indexOf(cur) < 0) ? prev.concat([cur]) : prev;
 }, []);