Buyurtma qatorida dublikatlarni olib tashlash

Men qilmoqchi bo'lgan narsa - qator qator elementlarning qatorida takrorlanganligini topish, ob'ektni ob'ektda takroriy sonlar bilan birga surish va keyin elementni va uning barcha nusxalarini yo'q qilishdir.

Hozirda men ushbu vazifani bajaraman:

function getDuplicates(arr) {
  let lastIndex = null;
  let obj = {};
  for ( let i = 0; i < arr.length; i++ ) {
    lastIndex = arr.lastIndexOf(arr[i]);
    obj[arr[i]] = lastIndex + 1;
    arr.splice(0, lastIndex + 1 );
  }
  console.log(obj);
}

getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);

which logs : { '1': 4, '2': 2, '3': 4, '5': 5 }

Birinchi 3 raqam uchun ajoyib ishlaydi (1,2 va 3), lekin 4 tasi ko'rinmaydi, 5 buziladi va 6 son indeks +1 tufayli ko'rsatilmaydi. Men nimadir etishmayaptimi yoki buning uchun yaxshiroq yo'l bormi?

Rahmat.

0
Siz avval googlega javob berganmisiz? Stackoverflow'ida ko'plab echimlar mavjud.
qo'shib qo'ydi muallif Robert Rocha, manba
Siz oddiygina yangi qator yaratishingiz va noyob elementlarni surishingiz mumkin.
qo'shib qo'ydi muallif Chantry Cargill, manba

7 javoblar

Array # (kichraytirishi mumkin) () va Array # filter() yordamida dublikatlarni olib tashlash uchun foydalanishingiz mumkin

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

getDuplicates([1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6]);

function getDuplicates(arr) {
  var obj = arr.reduce((map, item) => (map[item] = ++map[item] || 1, map),{} );
  var withoutDup = arr.filter((item, pos) => arr.indexOf(item) == pos);

  console.log(JSON.stringify(obj));
  console.log(JSON.stringify(withoutDup));
}
</div> </div>
0
qo'shib qo'ydi

Buni qanday hal qilishning bir usuli.

Birinchidan, new Set() dan foydalanib, berilgan nusxadagi barcha nusxalangan elementlarni o'chirib tashladim va keyin Array # forEach dan foydalangan holda Array # filter berilgan qatorda berilgan necha marta berilgan.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

function getDuplicates(arr){
  var filtered = [...new Set(arr)],
      result = {};
      filtered.forEach(function(v){
        result[v] = arr.filter(c => c == v).length;
      })
      console.log(result);
}
    
getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
</div> </div>

Array#reduce solution. <div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

function getDuplicates(arr) {
  var res = arr.reduce(function(s, a) {
    s[a] = arr.filter(c => c == a).length;
    return s;
  }, {});
  console.log(res);
}

getDuplicates([1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6]);
</div> </div>
0
qo'shib qo'ydi
@TudorApostol XSni o'rganishni xohlaysizmi? Agar shunday bo'lsa, javobimni va o'rganishni asta-sekin tekshirib turing. Bu vazifalar toza javascriptda qurish . Ularni bilmasdan JSda yaxshi bo'lmaydi. Shunday qilib, yigitni o'rganing, o'rganing!
qo'shib qo'ydi muallif kind user, manba
Men anwerni minnatdorman, ammo men "metodlarni" ishlab chiqmagan "dasturlash" yechimini qidiryapman.
qo'shib qo'ydi muallif Tudor Apostol, manba

COUNT ta replikatsiya qilishni xohlaysizmi, lekin agar xohlasangiz, @ChantryCargill taklifiga binoan takroriylarni (bosh satrlari kabi) olib tashlash kerak bo'lsa:

function removeDuplicates (arr) {
   var results = [];
   for(var i = 0; i < arr.length; i++) {
      var item = arr[i];
      if(results.indexOf(item) === -1) {
         results.push(item);
      }
   }
   return results;
}

console.log(removeDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ])); 
//[1, 2, 3, 4, 5, 6]

COUNT marta takrorlashni xohlasangiz:

function getDuplicates(arr) {
   var results = {};
   for(var item of arr) {
      if(!results[item]) {
         results[item] = 0;
      }
      results[item]++;
   }
   return results;
}

console.log(getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ])); 
//{"1":4,"2":2,"3":4,"4":2,"5":3,"6":1}
0
qo'shib qo'ydi
@Andreas "Ikkala nusxadagi tartiblangan qatorda o'chirish".
qo'shib qo'ydi muallif Arg0n, manba
" qator qator elementlar ketma-ketligi bilan necha marta takrorlanganligini toping, elementni takroriy sonlar bilan birga suring "
qo'shib qo'ydi muallif Andreas, manba
function getDuplicates(arr) {
  let lastNum = null;
  let obj = {};
  for ( let i = 0; i < arr.length; i++ ) {
    if (arr[i] != lastNum){
      lastNum = arr[i];
      obj[arr[i]] = 1;
    }else{
      obj[arr[i]]++;
    }
  }
  console.log(obj);
}
0
qo'shib qo'ydi

Buni ko'ring:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

function getDuplicates(){
  var numbers=Array.prototype.slice.call(arguments);
  var duplicates={};
  for(var index in numbers){
    if(numbers.indexOf(numbers[index])==index)
      continue;
    duplicates[numbers[index]]= (duplicates[numbers[index]] || 0) + 1;
  }
  return duplicates;
}

console.log(getDuplicates(1,2,3,1,1,3,4,5,6,7,8,6));
/*
prints {
  1: 2,
  3: 1,
  6: 1
}
*/
</div> </div>
0
qo'shib qo'ydi

Siz shunga o'xshash istalgan kabi hisoblashingiz va chop etishingiz mumkin:

function getDuplicates(arr) {
    var counts = {};
    arr.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
    console.log(counts);
}
0
qo'shib qo'ydi

Siz mantiqni juda soddalashtira olasiz. Faqat bitta ob'ekt va agar if qiymatlari qiymatlarni oshirish yoki agar aniqlanmagan bo'lsa 1 deb belgilash.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

function countDuplicates(arr) {
 //Contains a pair of values an instances.
  var counting = {};
 //Iterate array: check if already counted. If yes, increment, if not define as 1.
  for (el of arr) (counting[el]) ? counting[el]++ : counting[el] = 1;
  console.log(counting);
  return counting;
}

countDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
</div> </div>

Agar noyob elementlarni olishni istasangiz, siz faqatgina E6 to'siq :

var set = new Set([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
0
qo'shib qo'ydi
Men funktsiyaning ortida bo'lgan mantiqni yaxshi ko'raman, lekin uchun (el arr) uchun sintaksisni tushunmayapman (hisoblash [el])? hisoblash [el] ++: hisoblash [el] = 1; . Asosiy javascriptda tushuntirib bera olasizmi?
qo'shib qo'ydi muallif Tudor Apostol, manba
Agar shunday bo'lsa, unda quyidagi narsa bo'ladi: for (let i = 0; i
qo'shib qo'ydi muallif Tudor Apostol, manba
Qizig'i shundaki, agar men arifmetik bo'lmagan qatorlardan foydalansam, u hali ham xuddi shunday natijaga ega. Nima uchun ob'ekt tugmachalarini (eng kichikdan yirikgacha) tartibga keltirib chiqaradi?
qo'shib qo'ydi muallif Tudor Apostol, manba
To'g'ri! Sizning strukturangizni va ismlarimni aralashtirish uchun for (let i = 0; i Men kodni kichik qilish uchun shunday qildim :)
qo'shib qo'ydi muallif nitobuendia, manba
Chunki raqamlarni indeks sifatida ishlatmoqdamiz. Shuning uchun buyurtma har doim 0, 1, 2 ... Agar ularni stringga aylantirsangiz ham raqamlarni o'ylaydi va indeksga buyurtma beradi. Biroq, agar harakat qilsangiz: countDuplicates (['b', 'c', 'a']); , ularni buyurtma qilmaydi. Agar siz ularni tashqi ko'rinish tartibida saqlashni va kodni soddalashtirmoqchi bo'lsangiz, n ning boshida n ni qo'sha olasiz: {code = for arr} {el = 'n' + el; (hisobga olsak)? hisoblash [el] ++: count [el] = 1; } Biroq, 5 va hokazo o'rniga n5 bo'lishi kerak.
qo'shib qo'ydi muallif nitobuendia, manba
Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb