我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在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数组中删除重复值

类似的问题:

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


当前回答

一种可扩展、快速、高效且易于阅读的现代方法,使用iter ops库:

import {pipe, distinct} from 'iter-ops';

const input = [1, 1, 2, 2, 2, 3]; // our data

const i = pipe(input, distinct()); // distinct iterable

console.log([...i]); //=> [1, 2, 3]

如果您的输入是一个对象数组,则只需为不同的运算符提供一个键选择器。

其他回答

重复数据消除通常需要给定类型的相等运算符。然而,使用eq函数会阻止我们以有效的方式使用Set来确定重复项,因为Set返回到==。如您所知,==不适用于引用类型。所以,如果被卡住了,我们会很好,对吧?

解决方法是简单地使用一个转换器函数,它允许我们将一个(引用)类型转换为我们可以使用Set实际查找的类型。例如,如果数据结构不包含任何函数,我们可以使用哈希函数或JSON.stringify数据结构。

通常我们只需要访问一个属性,然后我们就可以比较它而不是Object的引用。

以下是满足这些要求的两个组合子:

常量重复数据消除On=k=>xs=>{const s=new Set();返回xs.filter(o=>s有(o[k])? 无效的:(s.add(o[k]),o[k]]);};常量重复数据消除By=f=>xs=>{const s=new Set();返回xs.filter(x=>{常量r=f(x);返回s.has(r)? 无效的:(s.add(r),x);});};const xs=[{foo:“a”},{foo:“b”};控制台日志(重复数据删除打开(“foo”)(xs));//〔{foo:“a”},{foo:“b”}、{foo:“a”}和{foo:“c”}〕控制台日志(重复数据删除方式(o=>o.foo.toLowerCase())(xs));//〔{foo:“a”}、{foo:“b”},{foo:“c”}〕

使用这些组合器,我们可以非常灵活地处理各种重复数据消除问题。这不是禁食的方法,而是最具表现力和通用性的方法。

如果有人使用knockoutjs

ko.utils.arrayGetDistinctValues()

顺便说一下,我们已经了解了所有ko.utils.array*实用程序。

我想从对象数组中删除重复项。重复项具有相同的ID。这是我所做的。

// prev data
const prev = [
  {
    id: 1,
    name: "foo",
  },
  {
    id: 2,
    name: "baz",
  },
  {
    id: 1,
    name: "foo",
  },
];

// method:
// Step 1: put them in an object with the id as the key. Value of same id would get overriden.
// Step 2: get all the values.

const tempObj = {};
prev.forEach((n) => (tempObj[n.id] = n));
const next = Object.values(tempObj);

// result
[
  {
    id: 1,
    name: "foo",
  },
  {
    id: 2,
    name: "baz",
  }
];

对我来说,这是最简单的解决方案

//检查数组是否相等的方法常量a=['a','B','C'].sort().toString()常量b=['A','C','b'].sort().toString()console.log(a===b);//真的//测试用例常量数据=[{组:“A”,名称:“SD”},{组:“B”,名称:“FI”},{组:“A”,名称:“SD”},{组:“B”,名称:“CO”}];//返回一个不带重复定位的新数组函数唯一(数据){return data.reduce(函数(累加器,currentValue){//转换为字符串以检查它们是否为相同的值。const currentKeys=对象.keys(currentValue).sort().toString();const currentValues=对象.values(currentValue).sort().toString();let hasObject=falsefor(累加器的常量对象){//将键和值转换为字符串,以便我们可以//看看它们是否与当前值相等constkeys=对象.keys(obj).sort().toString();const values=Object.values(obj).sort().toString();//检查键和值是否相等if(keys==currentKeys&&values==currentValues){hasObject=真}}//如果对象不存在,则推送该对象。if(!hasObject){累加器推力(currentValue)}回流蓄能器}, []);}//运行测试用例console.log(唯一(数据));//[{组:“A”,名称:“SD”},{组为“B”,名称为“FI”}、{组“B”、名称为“CO”}]

不扩展Array.prototype(据说这是一种糟糕的做法)或使用jquery/下划线,您可以简单地过滤数组。

通过保留最后一次出现:

    function arrayLastUnique(array) {
        return array.filter(function (a, b, c) {
            // keeps last occurrence
            return c.indexOf(a, b + 1) < 0;
        });
    },

或首次出现:

    function arrayFirstUnique(array) {
        return array.filter(function (a, b, c) {
            // keeps first occurrence
            return c.indexOf(a) === b;
        });
    },

嗯,它只是javascript ECMAScript 5+,这意味着只有IE9+,但它很适合用原生HTML/JS(Windows应用商店应用程序、Firefox OS、Sencha、Phonegap、Titanium…)开发。