2016-12-09 9 views
0

Ich habe eine Änderungsanordnung mit ausgewählten Elementen, in denen Schlüssel-ID:Map Array Array von Objekten

[1, 2, 4, 6] 

Und Array von Objekten:

items = [ 
    { 
    id: 1, 
    selected: false 
    }, 
    { 
    id: 2, 
    selected: false 
    }, 
    { 
    id: 3, 
    selected: false 
    }, 
    { 
    id: 4, 
    selected: false 
    }, 
    { 
    id: 5, 
    selected: true 
    }, 
    { 
    id: 6, 
    selected: false 
    } 
] 

Wie kann ich ausgewählte Array Artikel Karte und ändere 'selected' zu 'true' und für andere Elemente ändere 'false'?

+0

Es gibt eine Vielzahl von Möglichkeiten, wie Sie dies erreichen können. Können Sie jedoch weitere Details zu Ihrem Anwendungsfall angeben, da es möglicherweise einen besseren Ansatz gibt, dann einfach alle Elemente durchlaufen und den Wert aktualisieren? Zum Beispiel könnten Sie das 'items' Array zu einem hashmap/object machen und ähnlich aussehen:' items: {1: {id: 1, selected: false}} ', aber alles hängt davon ab –

Antwort

2
var items = [ 
    { 
    id: 1, 
    selected: false 
    }, 
    { 
    id: 2, 
    selected: false 
    }, 
    { 
    id: 3, 
    selected: false 
    }, 
    { 
    id: 4, 
    selected: false 
    }, 
    { 
    id: 5, 
    selected: true 
    }, 
    { 
    id: 6, 
    selected: false 
    } 
]; 
var array = [1, 2, 4, 6]; 

items.forEach(function(item) { 
    item.selected = (array.indexOf(item.id) !== -1); 
}) 
-1

Bitte versuchen Sie es. Ich denke, es wird funktionieren ...

$new=array(); 
foreach($items as $item){ 
    if($item['selected']==false){ 
$new.=array_merge($item['id']); 
    } 
} 
print_r($new); 

Und um nicht ausgewählte Elemente zu ändern.

foreach($items as $item){ 
if($item['selected']==false){ 
$item['selected']=true; 
} 
} 
+0

Welche Sprache ist das? ? –

0
var arr = [1,2,4,6]; 
var items = [ 
    { 
    id: 1, 
    selected: false 
    }, 
    { 
    id: 2, 
    selected: false 
    }, 
    { 
    id: 3, 
    selected: false 
    }, 
    { 
    id: 4, 
    selected: false 
    }, 
    { 
    id: 5, 
    selected: true 
    }, 
    { 
    id: 6, 
    selected: false 
    } 
]; 

var notSelected = $.grep(items, function(e) { return arr.indexOf(e.id) == -1 }).map(function(e) { e.selected = false; return e;}); 
var selected = $.grep(items, function(e) { return arr.indexOf(e.id) != -1 }).map(function(e) { e.selected = true; return e;}); 

Ergebnis:

notSelected.concat(selected); 
+0

in der Regel besser, keine jQuery-Lösungen zur Verfügung zu stellen, wenn nicht gewünscht. –

1

könnten Sie ein Map verwenden und das Array iterieren und alle false gesetzt und dann auf true die ausgewählt.

var selected = [1, 2, 4, 6], 
 
    items = [{ id: 1, selected: false }, { id: 2, selected: false }, { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: true }, { id: 6, selected: false }], 
 
    map = new Map; 
 

 
items.forEach(a => (map.set(a.id, a), a.selected = false)); 
 
selected.forEach(a => map.get(a).selected = true); 
 

 
console.log(items);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Eine Version mit Set.

var selected = [1, 2, 4, 6], 
 
    items = [{ id: 1, selected: false }, { id: 2, selected: false }, { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: true }, { id: 6, selected: false }], 
 
    set = new Set(selected); 
 

 
items.forEach(a => a.selected = set.has(a.id)); 
 

 
console.log(items);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Es scheint, dass sich 'selected' ändert, aber' items' nicht? In diesem Fall sollte die Lösung die Map einmal aus 'items' erstellen und dann' items' basierend auf dem neuen 'selected' aktualisieren. –

3
items.forEach(item => item.selected = array.contains(item.id)) 

einfach Schleife durch die Elemente, die ausgewählte Eigenschaft basierend auf Einstellung, ob die ID in dem Array enthalten ist.