2016-03-20 10 views
1
var d = [{id:1,name:"a",type:true},{id:2,name:"b",type:true},{id:3,name:"c",type:true},{id:4,name:"a",type:false}]; 
var done = []; 
$.each(d, function(i,obj) { 
    if(obj.type == true) { 
    done.push({name:obj.name}); 
    } 
}); 

wie kann ich sicherstellen, dass mein done Array von Objekten ist einzigartig Basis auf seiner Eigenschaft name?

+0

Das ist nicht JSON ist. JSON ist eine * textuelle Notation * für den Datenaustausch. Wenn Sie mit JavaScript-Quellcode arbeiten und sich nicht mit einem * string * befassen, handelt es sich nicht um JSON. –

Antwort

2

Sie temporäre Objekt c für das Caching name Eigenschaft verwenden:

var d = [{ id: 1, name: "a", type: true }, { id: 2, name: "b", type: true }, { id: 3, name: "c", type: true }, { id: 4, name: "a", type: false }]; 
 
var done = []; 
 

 
var c = {}; // cache for storing 'name' properties that was added to 'done' array 
 

 
$.each(d, function(i, obj) { 
 
    if (obj.type && !c[obj.name]) { // it checks if the cache not contains this 'name' 
 
     done.push({ name: obj.name }); 
 
     c[obj.name] = 'added'; // mark name that added to array 
 
    } 
 
}); 
 

 
document.write(JSON.stringify(done));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+1

brilliant, einfach, aber das Problem lösen! –

+0

@isvforall Könnten Sie uns etwas genauer erklären, wie das funktioniert? Es ist eine großartige Lösung, aber ich bin mir nicht 100% ig sicher, wie es funktioniert –

+1

@PaulFitzgerald '! C [obj.name]' es prüft, ob das Objekt 'c' bereits' name' enthält, zB 'a', wenn nicht, dann fügen wir hinzu '{name: obj.name}' zu 'done' Array und markiert dieses Objekt mit' name' 'a' hinzugefügt' c [obj.name] = 'hinzugefügt'; ' – isvforall

1

Sie Namen speichern können in einem Array, ob aktuelle Objektnamen Objektnamen Speicherung in Array

ist

var d = [{ 
 
    id: 1, 
 
    name: "a", 
 
    type: true 
 
}, { 
 
    id: 2, 
 
    name: "b", 
 
    type: true 
 
}, { 
 
    id: 3, 
 
    name: "c", 
 
    type: true 
 
}, { 
 
    id: 4, 
 
    name: "a", 
 
    type: false 
 
}, { 
 
    id: 5, 
 
    name: "a", 
 
    type: true 
 
}]; 
 
var done = [], names = []; 
 
$.each(d, function(i, obj) { 
 
    if (obj.type == true && $.inArray(obj.name, names) === -1) { 
 
    names.push(obj.name) 
 
    done.push({ 
 
     name: obj.name 
 
    }); 
 
    } 
 
}); 
 

 
names.length = 0; 
 

 
console.log(done)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


Alternativ mit $.unique(), $.map(), $.grep()

var d = [{ 
 
    id: 1, 
 
    name: "a", 
 
    type: true 
 
}, { 
 
    id: 2, 
 
    name: "b", 
 
    type: true 
 
}, { 
 
    id: 3, 
 
    name: "c", 
 
    type: true 
 
}, { 
 
    id: 4, 
 
    name: "a", 
 
    type: false 
 
}, { 
 
    id: 5, 
 
    name: "a", 
 
    type: true 
 
}]; 
 

 

 
var unique = $.unique($.map(d, function(obj, index) { 
 
    return obj.name 
 
    })), 
 
    done = $.grep(d, function(item, index) { 
 
    return item.name === unique[index] && index < unique.length ? { 
 
     name: item.name 
 
    } : null 
 
    }) 
 

 
console.log(done)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

0

Wenn Sie nur eindeutigen Namen von d erhalten möchten, können Sie tun,

var tmp ={}; 
d.forEach(function(obj){ 
    if(obj.type==true) tmp[obj.name]=1; 
}); 
var done = Object.keys(tmp).map(function(name){ 
    return {name: name}; 
}); 
0

Wenn Sie jQuery verwenden, können Sie die $ .unique-Funktion mit einem zugeordneten Vektorfeld der name-Eigenschaft verwenden. Für die Zuordnung können Sie entweder die map-Funktion jquery oder die map-Funktion von Array verwenden und dann keinen Ausdruck schreiben was eine Iteration verursacht, vergleichen Sie einfach die Länge von beiden, um sicher zu sein, dass Ihr Array fertig war name oder nicht.

done.length===$.unique(done.map(function(e){return e.a})).length 

wird der Ausdruck wahr zurück, wenn Sie fertig sind Array von Wert des Attributs einzigartig war name

Verwandte Themen