2017-12-14 6 views
0

Ich habe diesen Code, wo ich auf Duplikate prüfen, hat esDuplicate boolean, wenn es doppelt ist, aber ich möchte meinen Code zu erweitern und einen anderen zu vergleichen Eigenschaft, die Nummer ist und setBigger-Eigenschaft, für die größere :) Haben Sie Anregungen? vielen DankWenn JSON-Attribut Wert ist doppelt, vergleichen Sie seine andere Zahl Eigenschaft und setzen Attribut biggerDuplicate

hier ist mein Code:

$scope.verifyDuplicate = function() { 
    var names = [{ 
    "order": 1, 
    "name": "a", 
    "shortName": "a", 
    "isDuplicate": false, 
    "categoryId": 15070, 
    "colorId": 50 
    }, { 
    "order": 2, 
    "name": "s", 
    "shortName": "s", 
    "categoryId": 15071, 
    "colorId": 51 
    }, { 
    "order": 3, 
    "name": "h", 
    "shortName": "g", 
    "focused": 1513262627570, 
    "isDuplicate": true, 
    "categoryId": 15074, 
    "colorId": 54 
    }, { 
    "order": 4, 
    "name": "h", 
    "shortName": "h", 
    "isDuplicate": true, 
    "categoryId": 15075, 
    "colorId": 59 
    }]; 
    var sorted, i; 

    sorted = names.concat().sort(function(a, b) { 
    if (a.name > b.name) 
     return 1; 
    if (a.name < b.name) 
     return -1; 
    return 0; 
    }); 
    for (i = 0; i < names.length; i++) { 
    if (sorted[i].name !== '') { 
     sorted[i].isDuplicate = ((sorted[i - 1] && sorted[i - 1].name === sorted[i].name)) || ((sorted[i + 1] && sorted[i + 1].name === sorted[i].name)); 
    } 
    } 
}; 

Antwort

1

Ich würde dies tun, indem Sie Ihre Nummer als Teil der Art hinzufügen. Ich nehme an, es ist colorID

Dann erstellen Sie ein temporäres Objekt, das eine groupBy ist, wobei name als Schlüssel verwendet wird und Werte sind Streuung von Objekten mit diesem Namen.

Dann Schleife durch jede dieser Gruppen und stellen Sie Ihre Eigenschaften

let sorted = names.sort(function(a, b) { 
 
    // if names are same sort by colorId 
 
    return a.name.localeCompare(b.name) || a.colorId > b.colorId 
 
}); 
 

 
let tmp = sorted.reduce(function(a, c) { 
 
    a[c.name] = a[c.name] || []; 
 
    a[c.name].push(c); 
 
    return a; 
 
}, {}); 
 

 
Object.values(tmp).forEach(function(arr) { 
 
    let len = arr.length, 
 
    isDuplicate = len > 1;// if more than one in group they are all duplicates 
 
    arr.forEach(function(o, i) { 
 
    o.isDuplicate = isDuplicate; 
 
    if (isDuplicate) { 
 
     o.isBigger = i === len - 1;// already sorted by colorId so last one is biggest 
 
    } 
 
    }); 
 
}); 
 
console.log(sorted)
.as-console-wrapper {max-height: 100%!important;}
<script> 
 
var names = [{ 
 
    "order": 1, 
 
    "name": "a", 
 
    "shortName": "a",  
 
    "categoryId": 15070, 
 
    "colorId": 50 
 
    }, { 
 
    "order": 2, 
 
    "name": "s", 
 
    "shortName": "s", 
 
    "categoryId": 15071, 
 
    "colorId": 51 
 
    }, { 
 
    "order": 3, 
 
    "name": "h", 
 
    "shortName": "g", 
 
    "focused": 1513262627570, 
 
    "categoryId": 15074, 
 
    "colorId": 54 
 
    }, { 
 
    "order": 4, 
 
    "name": "h", 
 
    "shortName": "h", 
 
    
 
    "categoryId": 15075, 
 
    "colorId": 59 
 
    }]; 
 
</script>

+0

Charlietfl: danke, aber Object.values ​​funktioniert nicht auf IE:/ –

+0

kann verwenden ein 'für in 'Schleife stattdessen, oder suchen Sie nach einem Polyfill – charlietfl

Verwandte Themen