วิธีรับค่าที่ไม่ซ้ำในอาร์เรย์


168

ฉันจะรับรายการค่าที่ไม่ซ้ำในอาร์เรย์ได้อย่างไร ฉันต้องใช้อาร์เรย์ที่สองเสมอหรือมีบางสิ่งที่คล้ายกับ hashmap ของจาวาใน JavaScript หรือไม่?

ฉันจะใช้JavaScriptและjQueryเท่านั้น ไม่สามารถใช้ไลบรารีเพิ่มเติมได้


2
stackoverflow.com/questions/5381621/… - อธิบายสิ่งที่คุณต้องการฉันคิดว่า?
SpaceBison

1
คุณเปิดให้ใช้underscore.jsห้องสมุดหรือไม่
jakee

java hashmap นั้นเป็นวัตถุเดียวกับวัตถุจาวาสคริปต์ ไวยากรณ์คือ {"key": "value", "key2": "value2"}
Ian

API คอลเลกชัน JavaScript / TypeScript นั้นแย่มากเมื่อเทียบกับ Scalalist.toSet
Jordan Stewart

คำตอบ:


120

เมื่อฉันพูดถึงความคิดเห็นสำหรับคำตอบของ @ Rocket ฉันก็อาจให้ตัวอย่างที่ไม่มีห้องสมุด สิ่งนี้ต้องการฟังก์ชั่นต้นแบบใหม่สองอย่างcontainsและunique

Array.prototype.contains = function(v) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === v) return true;
  }
  return false;
};

Array.prototype.unique = function() {
  var arr = [];
  for (var i = 0; i < this.length; i++) {
    if (!arr.contains(this[i])) {
      arr.push(this[i]);
    }
  }
  return arr;
}

var duplicates = [1, 3, 4, 2, 1, 2, 3, 8];
var uniques = duplicates.unique(); // result = [1,3,4,2,8]

console.log(uniques);

เพื่อความน่าเชื่อถือมากขึ้นคุณสามารถแทนที่containsด้วยindexOfshim ของ MDN และตรวจสอบว่าแต่ละองค์ประกอบindexOfมีค่าเท่ากับ -1: เอกสารประกอบ


1
~a.indexOf(b) === (a.indexOf(b) == -1)
Orwellophile

1
@Lexynux: นั่นเป็นคำตอบที่ไม่สุภาพหากใช้คำสั่ง javascript-nerd ที่ใครบางคนที่เข้าใจในความหมายของมันและอาจจะไม่ถึงตอนนั้น สิ่งที่จะพูดคือการเขียนที่if (~a.indexOf(b)) ...เป็นเหมือนif (a.indexOf(b) == -1) ...การเขียนอีกต่อไป
Orwellophile

4
นี้มีความซับซ้อนเวลาทำงานสูง (กรณีที่เลวร้ายที่สุด: O (n ^ 2))
Rahul Arora

1
นี่เป็นการใช้งานที่ไม่มีประสิทธิภาพจริงๆ ตรวจสอบอาร์เรย์ผลลัพธ์เพื่อดูว่ามีรายการที่น่ากลัวอยู่แล้ว วิธีที่ดีกว่าคือการใช้วัตถุที่ติดตามการนับหรือถ้าคุณไม่ต้องการใช้หน่วยเก็บข้อมูล aux ให้เรียงลำดับแรกใน O (n log n) จากนั้นไปที่การกวาดเชิงเส้นและเปรียบเทียบองค์ประกอบแบบเคียงข้างกัน
Isaiah Lee

1
เราต้องการฟังก์ชั่น "บรรจุ" จริงๆหรือไม่?
Animesh Kumar

206

หรือสำหรับผู้ที่มองหาหนึ่งซับ (ง่ายและใช้งานได้) เข้ากันได้กับเบราว์เซอร์ปัจจุบัน :

let a = ["1", "1", "2", "3", "3", "1"];
let unique = a.filter((item, i, ar) => ar.indexOf(item) === i);
console.log(unique);

อัปเดต 18-04-2017

ดูเหมือนว่า 'Array.prototype.includes' ตอนนี้ได้รับการสนับสนุนอย่างกว้างขวางในเบราว์เซอร์ mainline เวอร์ชันล่าสุด ( ความเข้ากันได้ )

อัปเดต 29-07-2015:

มีแผนในการทำงานสำหรับเบราว์เซอร์เพื่อสนับสนุนวิธีการ 'Array.prototype.includes' ที่เป็นมาตรฐานซึ่งแม้ว่าจะไม่ตอบคำถามนี้โดยตรง มักจะเกี่ยวข้อง

การใช้งาน:

["1", "1", "2", "3", "3", "1"].includes("2");     // true

Pollyfill ( สนับสนุนเบราว์เซอร์ , แหล่งที่มาจาก Mozilla ):

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(searchElement, fromIndex) {

      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }

      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;

      // 5. If n ≥ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(searchElement, elementK) is true, return true.
        // c. Increase k by 1.
        // NOTE: === provides the correct "SameValueZero" comparison needed here.
        if (o[k] === searchElement) {
          return true;
        }
        k++;
      }

      // 8. Return false
      return false;
    }
  });
}

มันเกือบจะคัดลอกแปะจาก kennebec แต่การยอมรับว่าการส่งอาเรย์เป็นพารามิเตอร์แทนที่จะใช้การปิดอาจช่วยปรับปรุงประสิทธิภาพได้

- ต้องบอกว่าฉันไม่ได้เชื่อมต่อจุดต่าง ๆ เพียงสแกนผ่านหนึ่งไลเนอร์ดูเหมือนโพสต์ขนาดใหญ่ข้ามไปแล้วก็พบแหล่งที่มาอื่นและโพสต์ใหม่เพื่อให้คนอื่นค้นหาได้อย่างรวดเร็ว ที่กล่าวว่าสิทธิของคุณ; ค่อนข้างเหมือนกันกับ kennebec
Josh Mc

ดี - ไม่ทราบว่าตัวกรองที่ส่งไปในอาร์เรย์เป็นพารามิเตอร์และไม่ต้องการทำงานกับวัตถุภายนอก นี่คือสิ่งที่ฉันต้องการ - javascript เวอร์ชัน (รุ่น xerces รุ่นเก่า) ของฉันจะไม่มีสินค้าใหม่สักพัก
เจอราร์ด

1
@ GerardONeill ใช่บางสถานการณ์มันมีความสำคัญมากเช่นถ้ามันถูกผูกมัดตามหน้าที่และคุณต้องการเข้าถึงอาร์เรย์ที่ไม่ได้กำหนดตัวแปรเช่น. map (... ). filter (... )
Josh Mc

@Josh Mc คุณจะใช้วิธี 'รวม' ใน 'ไม่ซ้ำกัน' ได้ไหม?
vkelman

144

นี่เป็นวิธีแก้ปัญหาที่สะอาดกว่าสำหรับ ES6 ที่ฉันเห็นว่าไม่รวมอยู่ในนี้ มันใช้ชุดและผู้ประกอบการแพร่กระจาย :...

var a = [1, 1, 2];

[... new Set(a)]

ซึ่งผลตอบแทน [1, 2]


1
มันช่างฉลาดจริงๆ!
Josh Mc

1
ตอนนี้เป็นหนึ่งซับ!
Mac

11
ใน typescript คุณต้องใช้Array.from(... new Set(a))เนื่องจาก Set ไม่สามารถแปลงเป็นประเภทอาเรย์โดยปริยายได้ แค่หัวขึ้น!
Zachscs

4
@ Zachscs ฉันพบข้อผิดพลาดในการคอมไพล์เมื่อฉันลองใช้ คุณหมายถึงเพียงแค่Array.from(new Set(a))? ดูเหมือนว่าจะทำงาน
adam0101

72

หนึ่งไลเนอร์ Pure JavaScript

ด้วยไวยากรณ์ ES6

list = list.filter((x, i, a) => a.indexOf(x) === i)

x --> item in array
i --> index of item
a --> array reference, (in this case "list")

ป้อนคำอธิบายรูปภาพที่นี่

ด้วยไวยากรณ์ ES5

list = list.filter(function (x, i, a) { 
    return a.indexOf(x) === i; 
});

ความเข้ากันได้ของเบราว์เซอร์ : IE9 +


4
ไม่แน่ใจว่าทำไมสิ่งนี้จึงถูกโหวต มันอาจจะคลุมเครือเล็กน้อยในตอนแรกและอาจจัดว่าเป็น 'ฉลาด' และไม่จริงจังในการอ่าน แต่เป็นการประกาศไม่ทำลายและรัดกุมซึ่งส่วนใหญ่ของคำตอบอื่น ๆ จะขาด
Larry

1
@ Larry นี่คือการลงคะแนนเพราะคำตอบเดียวกันให้ปีก่อนหน้านี้
Alex Okrushko

@AlexOkrushko ยุติธรรมเพียงพอ - พลาดคำตอบนั้นเพราะวิธีการจัดรูปแบบ
Larry

7
ทุกอย่างเป็นหนึ่งในสายการบินถ้าคุณใส่ทุกอย่างไว้ในบรรทัดเดียว :-)
Gary McGill

มันอาจจะดีที่จะกระชับขึ้นเสมอภาคa.indexOf(x) === iโน้ตสามเครื่องหมายเท่ากับ
treejanitor

21

การใช้ EcmaScript 2016 คุณสามารถทำได้เช่นนี้

 var arr = ["a", "a", "b"];
 var uniqueArray = Array.from(new Set(arr)); // Unique Array ['a', 'b'];

ชุดมีความโดดเด่นอยู่เสมอและใช้งาน Array.from()คุณสามารถแปลงชุดเป็นอาร์เรย์ สำหรับการอ้างอิงให้ดูที่เอกสารประกอบ

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/dava/Wava/JavaScript/Reference/Global_Objects / ชุด


1
นี่คือคำตอบที่คุณควรใช้ indexOf()คำตอบนั้นแย่มากเพราะเป็น O (N ^ 2) คำตอบที่แพร่กระจายก็โอเค แต่จะไม่ทำงานสำหรับอาร์เรย์ขนาดใหญ่ นี่เป็นวิธีที่ดีที่สุด
Timmmm

20

ตอนนี้ใน ES6 เราสามารถใช้ฟังก์ชั่น ES6 ที่เพิ่งเปิดตัวใหม่

let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]
let uniqueItems = Array.from(new Set(items))

หรือโดยไวยากรณ์การแพร่กระจาย Array บน iterables

let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]; 
let uniqueItems = [...new Set(items)];

มันจะคืนผลลัพธ์ที่ไม่เหมือนใคร

[1, 3, 4, 5, 2, 23]

1
ทางออกที่สะอาดที่สุด!
Dimitris Filippou

นี่คือวิธีที่จะไปเมื่ออยู่ในสภาพแวดล้อมที่ JS ที่สนับสนุนnew Setเช่นนี้ (เช่นที่ทันสมัยเชิงมุม / typescript)
ดอนชีเดิล

1
มันคุ้มค่าที่สังเกตว่าคุณยังสามารถใช้การแพร่กระจายไวยากรณ์อาร์เรย์ใน iterables เหมือนชุดที่ตั้งและแผนที่: let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]; let uniqueItems = [...new Set(items)];
jacobedawson

ฉันชอบคำตอบ ES6 เหล่านี้!
เกลน ธ อมป์สัน

1
นี่เหมือนกับคำตอบของ @Adeel Imran โปรดอย่าทำคำตอบที่ตรงกับคำตอบที่มีอยู่ทั้งหมด
Timmmm

16

ถ้าคุณต้องการปล่อยให้อาร์เรย์เดิมไม่เปลี่ยนแปลง

คุณต้องการอาเรย์ที่สองเพื่อให้มีองค์ประกอบ uniqe ของแรก -

เบราว์เซอร์ส่วนใหญ่มีArray.prototype.filter:

var unique= array1.filter(function(itm, i){
    return array1.indexOf(itm)== i; 
    // returns true for only the first instance of itm
});


//if you need a 'shim':
Array.prototype.filter= Array.prototype.filter || function(fun, scope){
    var T= this, A= [], i= 0, itm, L= T.length;
    if(typeof fun== 'function'){
        while(i<L){
            if(i in T){
                itm= T[i];
                if(fun.call(scope, itm, i, T)) A[A.length]= itm;
            }
            ++i;
        }
    }
    return A;
}
 Array.prototype.indexOf= Array.prototype.indexOf || function(what, i){
        if(!i || typeof i!= 'number') i= 0;
        var L= this.length;
        while(i<L){
            if(this[i]=== what) return i;
            ++i;
        }
        return -1;
    }

14

วันนี้คุณสามารถใช้ชุดข้อมูลของ ES6 เพื่อแปลงชุดของคุณเป็นชุดเฉพาะ จากนั้นหากคุณต้องการใช้วิธีอาร์เรย์คุณสามารถเปลี่ยนกลับเป็น Array ได้

var arr = ["a", "a", "b"];
var uniqueSet = new Set(arr); // {"a", "b"}
var uniqueArr = Array.from(uniqueSet); // ["a", "b"]
//Then continue to use array methods:
uniqueArr.join(", "); // "a, b"

1
เรียบร้อยฉันยินดีที่จะดูตัวเลขที่สมบูรณ์แบบฉันคิดว่าการแปลงชุดพิเศษโดยเฉพาะถ้าพวกมันมีพลังและขนาดใหญ่อาจเป็น hickup ประสิทธิภาพวิธีเดียวที่จะบอกคือการทดสอบ :)
Astronaut

2
หากคุณกำลังใช้ transpiler หรืออยู่ในสภาพแวดล้อมที่สนับสนุนคุณสามารถทำสิ่งเดียวกันได้อย่างกระชับยิ่งขึ้นเมื่อ:var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Stenerson

เฮ้ @Astronaut ได้ทำการทดสอบบางอย่างเกี่ยวกับประสิทธิภาพที่คุณพูด?
alexventuraio

8

ไม่ใช่เนทีฟใน Javascript แต่มีไลบรารีจำนวนมากที่มีวิธีนี้

Underscore.js's _.uniq(array)( ลิงก์ ) ทำงานได้ค่อนข้างดี ( แหล่งที่มา )


ขอบคุณสำหรับการแบ่งปัน! ฟังก์ชันนี้ใช้ตัววนซ้ำและบริบทพร้อมกับอาร์เรย์เป็นรายการอาร์กิวเมนต์จาก v1.4.3
Kunj

6

ใช้ jQuery นี่คือฟังก์ชั่นที่เป็นเอกลักษณ์ของ Array ที่ฉันทำ:

Array.prototype.unique = function () {
    var arr = this;
    return $.grep(arr, function (v, i) {
        return $.inArray(v, arr) === i;
    });
}

console.log([1,2,3,1,2,3].unique()); // [1,2,3]

5
ถ้าคุณจะใช้ jQuery ในต้นแบบของวัตถุ javascript core มันจะดีกว่าไหมถ้าจะเขียนฟังก์ชั่น jQuery เช่น$.uniqueArray(arr)? ฝังอ้างอิงถึง jQuery ภายในArrayต้นแบบ 's น่าสงสัย
jackwanders

1
@jackwanders: มีคำถามอะไรเกี่ยวกับมันเหรอ? หากคุณมี jQuery บนหน้าเว็บลองใช้กันดู
Rocket Hazmat

เพียงว่าฟังก์ชั่นใหม่ที่คุณเขียนนั้นขึ้นอยู่กับ jQuery คุณไม่สามารถย้ายไปยังไซต์หรือแอพใหม่โดยไม่ทำให้แน่ใจว่า jQuery ใช้งานอยู่ที่นั่น
jackwanders

2
นั่นคือประเด็นของฉัน; หากคุณกำลังจะใช้ jQuery ให้ทำให้ฟังก์ชันเป็นส่วนหนึ่งของ jQuery ถ้าฉันจะขยายต้นแบบของวัตถุหลักฉันจะยึดจาวาสคริปต์หลักเพื่อให้สิ่งต่าง ๆ สามารถนำกลับมาใช้ใหม่ได้ หากมีคนอื่นมองดูรหัสของคุณจะเห็นได้ชัดว่า$.uniqueArrayพึ่งพา jQuery ชัดเจนน้อยลงArray.prototype.uniqueเช่นกัน
jackwanders

1
@jackwanders: ฉันเดา ฉันใช้สิ่งนี้ในรหัสของฉันเพราะฉันมักจะใช้ jQuery และฉันก็ชอบที่จะขยายprototypes แต่ตอนนี้ฉันเข้าใจประเด็นของคุณแล้ว ฉันจะออกจากที่นี่ต่อไป
Rocket Hazmat

6

วิธีแก้ปัญหาสั้นและหวานโดยใช้อาร์เรย์ที่สอง

var axes2=[1,4,5,2,3,1,2,3,4,5,1,3,4];

    var distinct_axes2=[];

    for(var i=0;i<axes2.length;i++)
        {
        var str=axes2[i];
        if(distinct_axes2.indexOf(str)==-1)
            {
            distinct_axes2.push(str);
            }
        }
    console.log("distinct_axes2 : "+distinct_axes2); // distinct_axes2 : 1,4,5,2,3

สั้น? และหวาน คุณเคยดูคำตอบที่ดีที่สุดแล้วหรือยัง?
Alex Okrushko

5

รวดเร็วกะทัดรัดไม่มีลูปซ้อนใช้งานกับวัตถุใด ๆ ไม่เพียง แต่สตริงและตัวเลขใช้เพรดิเคตและโค้ดเพียง 5 บรรทัด !!

function findUnique(arr, predicate) {
  var found = {};
  arr.forEach(d => {
    found[predicate(d)] = d;
  });
  return Object.keys(found).map(key => found[key]); 
}

ตัวอย่าง: เพื่อค้นหารายการที่ไม่ซ้ำตามประเภท:

var things = [
  { name: 'charm', type: 'quark'},
  { name: 'strange', type: 'quark'},
  { name: 'proton', type: 'boson'},
];

var result = findUnique(things, d => d.type);
//  [
//    { name: 'charm', type: 'quark'},
//    { name: 'proton', type: 'boson'}
//  ] 

ถ้าคุณต้องการที่จะหารายการที่ไม่ซ้ำกันเป็นครั้งแรกแทนการเพิ่มพบ found.hasOwnPropery () ตรวจสอบที่นั่น


4

คุณต้องใช้วานิลลา JS เพื่อค้นหาสิ่งแปลกใหม่ด้วย Array.some และ Array.reduce ด้วยไวยากรณ์ ES2015 มีเพียง 62 ตัวอักษร

a.reduce((c, v) => b.some(w => w === v) ? c : c.concat(v)), b)

Array.some และ Array.reduce รองรับใน IE9 + และเบราว์เซอร์อื่น ๆ เพียงแค่เปลี่ยนฟังก์ชั่นลูกศรไขมันสำหรับฟังก์ชั่นปกติเพื่อรองรับในเบราว์เซอร์ที่ไม่รองรับไวยากรณ์ ES2015

var a = [1,2,3];
var b = [4,5,6];
// .reduce can return a subset or superset
var uniques = a.reduce(function(c, v){
    // .some stops on the first time the function returns true                
    return (b.some(function(w){ return w === v; }) ?  
      // if there's a match, return the array "c"
      c :     
      // if there's no match, then add to the end and return the entire array                                        
      c.concat(v)}),                                  
  // the second param in .reduce is the starting variable. This is will be "c" the first time it runs.
  b);                                                 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/th-US/dava/JavaScript/Reference/Global_Objects / อาร์เรย์ / ลด


4

โซลูชันส่วนใหญ่ด้านบนมีความซับซ้อนของเวลาทำงานสูง

นี่คือโซลูชันที่ใช้reduceและสามารถทำงานได้ในเวลาO (n)

Array.prototype.unique = Array.prototype.unique || function() {
        var arr = [];
	this.reduce(function (hash, num) {
		if(typeof hash[num] === 'undefined') {
			hash[num] = 1; 
			arr.push(num);
		}
		return hash;
	}, {});
	return arr;
}
    
var myArr = [3,1,2,3,3,3];
console.log(myArr.unique()); //[3,1,2];

บันทึก:

วิธีนี้ไม่ได้ขึ้นอยู่กับการลด แนวคิดคือการสร้างแผนที่วัตถุและผลักวัตถุที่ไม่ซ้ำกันลงในอาร์เรย์



1

คุณสามารถใช้ได้,

let arr1 = [1,2,1,3];
let arr2 = [2,3,4,5,1,2,3];

let arr3 = [...new Set([...arr1,...arr2])];

มันจะให้องค์ประกอบที่เป็นเอกลักษณ์

**> แต่มีการจับ

สำหรับ "1" นี้และ 1 และเป็นองค์ประกอบต่างกัน **

ตัวเลือกที่สองคือการใช้วิธีการกรองในอาร์เรย์


1

คุณสามารถป้อนอาร์เรย์ด้วยรายการที่ซ้ำกันและวิธีการด้านล่างจะส่งคืนอาร์เรย์ที่มีองค์ประกอบที่ไม่ซ้ำกัน

function getUniqueArray(array){
    var uniqueArray = [];
    if (array.length > 0) {
       uniqueArray[0] = array[0];
    }
    for(var i = 0; i < array.length; i++){
        var isExist = false;
        for(var j = 0; j < uniqueArray.length; j++){
            if(array[i] == uniqueArray[j]){
                isExist = true;
                break;
            }
            else{
                isExist = false;
            }
        }
        if(isExist == false){
            uniqueArray[uniqueArray.length] = array[i];
        }
    }
    return uniqueArray;
}

0

ปัญหาเดียวของวิธีแก้ปัญหาที่ให้มาคือประสิทธิภาพ หากคุณกังวลว่า (และคุณควรจะทำ) คุณต้องหลีกเลี่ยงการวนซ้ำซ้อนกัน: สำหรับ * for, filter * indexOf, grep * inArray พวกมันทั้งหมดจะวนซ้ำหลาย ๆ ครั้ง คุณสามารถใช้ลูปเดียวด้วยโซลูชันเช่นนี้หรือสิ่งนี้


0
Array.prototype.unique = function () {
    var dictionary = {};
    var uniqueValues = [];
    for (var i = 0; i < this.length; i++) {
        if (dictionary[this[i]] == undefined){
            dictionary[this[i]] = i;
            uniqueValues.push(this[i]);
        }
    }
    return uniqueValues; 
}

0

ฉันได้ลองใช้ปัญหานี้กับ JS บริสุทธิ์แล้ว ฉันได้ทำตามขั้นตอนต่อไปนี้ 1. เรียงลำดับอาร์เรย์ที่กำหนด 2. วนรอบอาร์เรย์ที่เรียงลำดับ 3. ตรวจสอบค่าก่อนหน้าและค่าถัดไปด้วยค่าปัจจุบัน

// JS
var inpArr = [1, 5, 5, 4, 3, 3, 2, 2, 2,2, 100, 100, -1];

//sort the given array
inpArr.sort(function(a, b){
    return a-b;
});

var finalArr = [];
//loop through the inpArr
for(var i=0; i<inpArr.length; i++){
    //check previous and next value 
  if(inpArr[i-1]!=inpArr[i] && inpArr[i] != inpArr[i+1]){
        finalArr.push(inpArr[i]);
  }
}
console.log(finalArr);

การสาธิต


0
function findUniques(arr){
  let uniques = []
  arr.forEach(n => {
    if(!uniques.includes(n)){
      uniques.push(n)
    }       
  })
  return uniques
}

let arr = ["3", "3", "4", "4", "4", "5", "7", "9", "b", "d", "e", "f", "h", "q", "r", "t", "t"]

findUniques(arr)
// ["3", "4", "5", "7", "9", "b", "d", "e", "f", "h", "q", "r", "t"]

0

เมื่อทราบว่าindexOfจะคืนค่าการปรากฏตัวครั้งแรกขององค์ประกอบคุณสามารถทำสิ่งนี้:

Array.prototype.unique = function(){
        var self = this;
        return this.filter(function(elem, index){
            return self.indexOf(elem) === index;
        })
    }

0

หากคุณไม่จำเป็นต้องกังวลเกี่ยวกับเบราว์เซอร์รุ่นเก่านี่คือสิ่งที่ชุดการออกแบบมา

การตั้งค่าวัตถุช่วยให้คุณเก็บค่าที่ไม่ซ้ำของประเภทใด ๆ ไม่ว่าจะเป็นค่าดั้งเดิมหรือการอ้างอิงวัตถุ

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const set1 = new Set([1, 2, 3, 4, 5, 1]);
// returns Set(5) {1, 2, 3, 4, 5}

0

ความคิดอื่นของคำถามนี้ นี่คือสิ่งที่ฉันทำเพื่อบรรลุสิ่งนี้โดยใช้รหัสน้อยลง

var distinctMap = {};
var testArray = ['John', 'John', 'Jason', 'Jason'];
for (var i = 0; i < testArray.length; i++) {
  var value = testArray[i];
  distinctMap[value] = '';
};
var unique_values = Object.keys(distinctMap);

console.log(unique_values);



0

นี่คือวิธีการที่มีequalsฟังก์ชั่นที่ปรับแต่งได้ซึ่งสามารถใช้สำหรับการพื้นฐานและสำหรับวัตถุที่กำหนดเอง:

Array.prototype.pushUnique = function(element, equalsPredicate = (l, r) => l == r) {
    let res = !this.find(item => equalsPredicate(item, element))
    if(res){
        this.push(element)
    }
    return res
}

การใช้งาน:

//with custom equals for objects
myArrayWithObjects.pushUnique(myObject, (left, right) => left.id == right.id)

//with default equals for primitives
myArrayWithPrimitives.pushUnique(somePrimitive)

0

คำตอบของฉันใช้Array.filterและArray.indexOfวิธีการต่าง ๆ เพื่อให้ได้คุณค่าที่เป็นเอกลักษณ์

array.filter((value, index, self)=>self.indexOf(value)===index)

ฉันเห็นวิธีการนี้ในเว็บไซต์ แต่รหัสของพวกเขาแตกต่างจากที่นี่ ฉันลดความซับซ้อนของรหัสไปที่หนึ่งบรรทัดและโพสต์ไว้ที่นี่เพื่อให้บางคนได้รับประโยชน์จากมัน

หมายเหตุ: วิธีการของฉันคล้ายหรือเหมือนกับหนึ่งซับที่โพสต์โดย Josh ฉันปล่อยไว้ที่นี่เนื่องจากชื่อตัวแปรอธิบายตนเองในรหัสของฉัน


-1

ฉันแค่คิดว่าเราสามารถใช้การค้นหาเชิงเส้นเพื่อกำจัดรายการที่ซ้ำกัน:

JavaScript:
function getUniqueRadios() {

var x=document.getElementById("QnA");
var ansArray = new Array();
var prev;


for (var i=0;i<x.length;i++)
  {
    // Check for unique radio button group
    if (x.elements[i].type == "radio")
    {
            // For the first element prev will be null, hence push it into array and set the prev var.
            if (prev == null)
            {
                prev = x.elements[i].name;
                ansArray.push(x.elements[i].name);
            } else {
                   // We will only push the next radio element if its not identical to previous.
                   if (prev != x.elements[i].name)
                   {
                       prev = x.elements[i].name;
                       ansArray.push(x.elements[i].name);
                   }
            }
    }

  }

   alert(ansArray);

}

HTML:

<body>

<form name="QnA" action="" method='post' ">

<input type="radio"  name="g1" value="ANSTYPE1"> good </input>
<input type="radio" name="g1" value="ANSTYPE2"> avg </input>

<input type="radio"  name="g2" value="ANSTYPE3"> Type1 </input>
<input type="radio" name="g2" value="ANSTYPE2"> Type2 </input>


<input type="submit" value='SUBMIT' onClick="javascript:getUniqueRadios()"></input>


</form>
</body>

-1

นี่คือวิธีแก้ปัญหาหนึ่งซับสำหรับปัญหา:

var seriesValues = [120, 120, 120, 120];
seriesValues = seriesValues.filter((value, index, seriesValues) => (seriesValues.slice(0, index)).indexOf(value) === -1);
console.log(seriesValues);

คัดลอกวางส่วนนี้ลงในคอนโซลของเบราว์เซอร์และรับผลลัพธ์ yo :-)


-2

ฉันมีฟังก์ชั่นที่ไม่ซ้ำ JQuery ที่ไม่ซ้ำกัน

uniqueValues= jQuery.unique( duplicateValues );

สำหรับข้อมูลเพิ่มเติมคุณสามารถอ้างอิงเอกสาร jquery API

http://api.jquery.com/jquery.unique/


8
โปรดทราบว่าจะใช้งานได้กับอาร์เรย์ขององค์ประกอบ DOM เท่านั้นไม่ใช่สตริงหรือตัวเลข - อ้างจากเอกสาร
mco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.