folder Tahribat.com Forumları
linefolder Html - CSS - XML - JavaScript - Ajax
linefolder [ÇÖZÜLDÜ GİBİ] JS'de JSON Array Üzerinde Bazı Döngü İşlemleri (Yardım Gerekli)



[ÇÖZÜLDÜ GİBİ] JS'de JSON Array Üzerinde Bazı Döngü İşlemleri (Yardım Gerekli)

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    const ucuslar = [

        { ucusNo: 2233, frekans: 12},

        { ucusNo: 2234, frekans: 5},

        { ucusNo: 2234, frekans: 25},

        { ucusNo: 2234, frekans: 2},

        { ucusNo: 2235, frekans: 3},

        { ucusNo: 2235, frekans: 14},

    ]

    Yukarıdaki örnek json array i kullanarak tekrarlayan ucusNo ların frekans değeri en yüksek olanını seçip düşük frekans değerli tekrarlayan itemleri içermeyen yeni bir array oluşturmayı javascript ile nasıl yaparım? Tekrarlamayan ucusNo ya sahip item'ler de dahil edilmeli.

    Şununla çoklamış ucusNo ları silebiliyorum ama frekansı büyük olanı almasını istiyorum:

    function removeDuplicatesBy(keyFn, array) {
        var mySet = new Set();
        return array.filter(function(x) {
            var key = keyFn(x), isNew = !mySet.has(key);
            if (isNew) mySet.add(key);
            return isNew;
        });
    }
    
    const mapped = removeDuplicatesBy(x => x.ucusNo, ucuslar);

    Yardımcı olabilirseniz sevinirim, çözemedim.

    Sevgiler..

    RockZs tarafından 13/Nis/18 17:58 tarihinde düzenlenmiştir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    entourage
    entourage's avatar
    Kayıt Tarihi: 30/Eylül/2015
    Erkek

    duplicated olanları döngüye sok ve frekanslarını karşılaştır yine bir döngüyle. frekansları karşılaştırırken ilk değeri yeni bir değişkene ata ve if else statement ekle döngü içine. böylece en büyük frekansı elde edeceksin. bunun dışındaki frekans sayılarına sahip olan duplicated objectleri sil. yapacağın fonksiyon nested olmalı.

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek
    entourage bunu yazdı

    duplicated olanları döngüye sok ve frekanslarını karşılaştır yine bir döngüyle. frekansları karşılaştırırken ilk değeri yeni bir değişkene ata ve if else statement ekle döngü içine. böylece en büyük frekansı elde edeceksin. bunun dışındaki frekans sayılarına sahip olan duplicated objectleri sil. yapacağın fonksiyon nested olmalı.

    sağol. olabilir. benim aklıma da iki kere "sort" edip (önce frekans, ardından ucusNo ya göre), sonra "duplicate" leri silmek geldi. böylece kalan veriler frekansı büyük olanlar olmuş oluyor. aşağıdaki kodla yaptım da kodu promise yapısı içinde yazmak istedim, removeDuplicates fonk'nu bir türlü promise içinde zincirleme çalıştırmayı beceremedim, uğraşmaya devam..

    const ucuslar = [
        { ucusNo: 2233, frekans: 12},
        { ucusNo: 2234, frekans: 5},
        { ucusNo: 2234, frekans: 25},
        { ucusNo: 2234, frekans: 2},
        { ucusNo: 2235, frekans: 3},
        { ucusNo: 2235, frekans: 14},
    ]
    
    let freqAlgorithm = (a,b) => {
        return a.frekans < b.frekans
    }
    
    let numberAlgorithm = (a,b) => {
        return a.ucusNo > b.ucusNo
    }
    
    let sortByFreq = () => {
        return new Promise(function(resolve, reject){
            ucuslar.sort(freqAlgorithm)
            console.log(`sorted by frequency`)
            resolve()
        })
    }
    
    let sortByNo = () => {
        return new Promise(function(resolve,reject){
            ucuslar.sort(numberAlgorithm)
            console.log(`sorted by flight number`)
            resolve()
        })
    }
    
    let print = () => {
        return new Promise(function(resolve, reject){
            //console.log(ucuslar)
            resolve()
        })
    }
    
    /*
    function removeDuplicates(myArr, prop) {
        return myArr.filter((obj, pos, arr) => {
            return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
        });
    }
    
    removeDuplicates(ucuslar, 'ucusNo')
    */
    
    let sortJson = () => {
        sortByFreq().then(function(){
            return sortByNo()
        }).then(function(){
            return print()
        })
        .catch(function(e){
            throw e
        })
    }
    
    sortJson()

     

    RockZs tarafından 13/Nis/18 18:00 tarihinde düzenlenmiştir
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Retro
    by_Tet
    by_Tet's avatar
    Kayıt Tarihi: 22/Mayıs/2012
    Erkek

    Hocam açıklayıcı olması için chrome'da konsola yapıştır gör şeklinde yazdım.

    Problemleri ve çözümleri yazarsam kod açıklayıcı olacaktır.

    Problem: array içindeki objeleri kendi içerisinde değerlendirmek.

    Çözüm:

    Array içinde karşılaştırmayı key value olarak yapabiliriz ancak array içinde key ve value değeri bulunan 2 object listesi işin içine girince kafamız karışıyor. Hemen yeni bir array oluşturuyoruz.

    Ne de olsa array içerisindeki key ve value'yı çekmek kolay (not: array[key] = value;) Keyi de istediğimiz gibi verebiliyorsak ve her ucusNo benzersiz ise yeni bir temp array oluşturalım.

    Bu array içerisine benzersiz uçuş no ile frekans atayalım. Bu frekansın en büyük olmasını sağlayalım. (logMapElements)

     

    Problem: En büyük frekansı bildiğimiz her objeyi silmek.

    Çözüm:

    Aslında basit keyini bildiğimiz her arrayi remove array[key] ile silebiliyoruz. Ancak böyle sildiğimizde dizi içinden tamamiyle silmeyecek 'empty' verecektir. Yani sonuçta bastırınca 6 elemanlı gözüken aslen 3 girdili bir array gelecektir. (deleteMapElements)

     

    Problem: Dizideki boş girdileri ayıklamak

    Çözüm: Yeni bir temp array oluşturmak varken neden uğraşalım. Foreach döngüsü boş girdileri okumayacaktır o halde yeni bir array oluşturup içine eskisini foreachla pushlayalım. (fixMapElements)

     

    Genel not: Peki hepsini tek bir map ile halledemez miydik? Elbette hallederdik ama vakit çok önemli. Mesela ben öyle halletseydim şuan bu açıklamaları geniş geniş yapan bir yazı yazamayıp yalnızca kodu atmış olacaktım. Ki neden o kadar uğraşalım :)

     

    const ucuslar = [
        { ucusNo: 2233, frekans: 12},
        { ucusNo: 2234, frekans: 5},
        { ucusNo: 2234, frekans: 25},
        { ucusNo: 2234, frekans: 2},
        { ucusNo: 2235, frekans: 3},
        { ucusNo: 2235, frekans: 14},
    ];
    
    var ucuslarTemp = [];
    var newUcuslar = [];
    
    console.log(ucuslar);
    
    function logMapElements(value, key, map) {
      if(ucuslarTemp[value["ucusNo"]]){
    	if(ucuslarTemp[value["ucusNo"]] < value["frekans"]) ucuslarTemp[value["ucusNo"]] = value["frekans"];
      } else ucuslarTemp[value["ucusNo"]] = value["frekans"];
    }
    
    function deleteMapElements(value, key, map) {
    	if(ucuslarTemp[value["ucusNo"]] > value["frekans"]) {
    		delete ucuslar[key];
        }
    }
    
    function fixMapElements(value, key, map) {
      newUcuslar.push(value);
    }
    
    ucuslar.forEach(logMapElements);
    ucuslar.forEach(deleteMapElements);
    ucuslar.forEach(fixMapElements);
    
    console.log(ucuslar);
    console.log(newUcuslar);
    by_Tet tarafından 13/Nis/18 21:22 tarihinde düzenlenmiştir

    iyibu! yeniden..
Toplam Hit: 1081 Toplam Mesaj: 4
javascript object notation