2016-05-19 12 views
2

Lassen Sie sich sagen, ich habe unten Objekt:Javascript Split Objekt durch Schlüssel

var obj = { 
     name:'Jone', 
     age:'23', 
     height:200, 
     weight:400, 
    } 

ich dies will:

var obj1 = { 
     name:'Jone', 
     age:'23' 
    } 

    var obj2 = { 
     height:200, 
     weight:400 
    } 

wirklich das, was ich suche ist obj.splice('age') Bedeutung, die dieses Objekt in zwei Objekte aufgeteilt , ausgehend von age als Schlüssel.

Ich weiß, ich kann Schleife und tun es auf die harte Tour, aber gibt es eine gleichwertige einfache nette Weise?

Auch, wenn es einen Angular2ish Weg (ein verstecktes Dienstprogramm vielleicht?), Wäre noch besser.

EDIT: Ich weiß nicht genau, was in dem Objekt ist, ich weiß nur, dass mein Schlüssel drin ist.

Was ich wirklich tue ist, ich möchte ein Objekt umschlingen, aber ich habe einen Startpunkt und ich möchte nicht alle durchlaufen, ich möchte in der Lage sein, das Objekt zu schneiden und nur die Schleife aus zu starten wo ich brauche.

Object.keys(obj).map(function(value , index) { 
     // I'm just looping here to do some stuff , which is not related to the question here. 


    }); 

Offensichtlich Ich Looping über alle Tasten dieses Objekt, aber ich will von age starten.

Ich hoffe, das ist klar.

BEARBEITEN; Ich weiß, dass dies ein wenig aus dem Board, aber in Angular2, haben wir ein FormModel und wir können mehrere controlGroup drin haben, möchte ich im Grunde in der Lage, die erste controlGroup zu finden, die ungültig ist, das ist es.

+4

Sie klingen, als würden Sie darauf zählen, dass Objekteigenschaften in einer bekannten Reihenfolge sind. Es gibt zwar Umstände, unter denen eine Bestellung vorhersehbar ist, aber das ist kein übliches Merkmal von Eigenschaften (sie haben normalerweise keine Bestellung). Also, was Sie fordern, schlägt vor, dass die ursprüngliche Datenstruktur geändert werden sollte oder was Sie versuchen, sollte geändert werden. Es ist so, als ob du sagst, dass ein Haus eine Wiese, ein Dach, einen Pool und einen Baum hat und du gerne Dinge nach dem Dach aufteilen würdest, aber die Dinge sind nicht in einer bestimmten Reihenfolge - sie sind nur Eigenschaften. – jfriend00

+0

@ jfriend00, du hast absolut recht, aber all das kommt von einem Formular, das in angular2 erstellt wird. Ich möchte in der Lage sein, den Formularabschnitt zu finden, der ungültig ist, also muss ich die Kontrollen durchlaufen und das erste inValid finden. Aber Sie sind Punkt richtig, vielleicht muss ich eine andere Lösung finden! – Milad

+0

Sie sollten Funktionen verwenden, die DOM-Traversal durchführen, kein Objekt. – Barmar

Antwort

1

PLUNKER DEMO

Von dem, was ich weiß, und von Ihrem Problem zu verstehen,

ControlGroup ist ein Object und wie andere haben auch festgestellt, dass die Eigenschaften don't have a specific order, und Sie können nicht einmal darauf verlassen Wenn Sie wissen, dass es in alphabetical order ist.


Ich gehe davon aus, dass Sie entweder die controlGroupsformBuilder mit schreiben oder mit einer Schleife erzeugen.

  • Wenn Sie bereits ein Array von dem, was controlGroups werden da sein, speichern Sie sie in einem Array wie

cgs = ['controlGroup1', 'controlGroup2', 'controlGroup3'] 

genau in der Reihenfolge, die Sie Legen Sie sie in die template. Jetzt wissen Sie, wonach Sie suchen.


  • Wenn Sie dies nicht tun,
    • Sie ein Array erstellen können
    • Wenn Sie nicht, wie die DOM durchqueren

let domList = document.querySelectorAll('*[ngControlGroup]'); 
let cgEls = Array.apply(null, domList); 
var cgs = []; // will store the ordered list of controlGroups 

cgEls.forEach((e) => { 
cgs.push(e.attributes.ngControlGroup.value); 
}) 

JETZT kennen Sie die Reihenfolge, überprüfen Sie nach ihrer Gültigkeit eins nach dem anderen.


Hoffe, es hilft.

+0

Das klingt nach einer guten Lösung, ich benutze Form Builder, aber 'document.querySelectorAll ('[ngControlGroup]')' wird leer zurückgeben. – Milad

+0

warum so? verwenden Sie nicht verschachtelte 'controlGroups'? –

+0

Ja, ich bin, kann aber keine ngControlGroup attr in DOM finden, wenn ich inspiziere – Milad

0

Sie können dies tun:

var obj = { 
    name: 'Jone', 
    age: '23', 
    height: 200, 
    weight: 400, 
} 

var obj1 = {} 
var obj2 = {} 

function splitAtAge(input) { 
    var afterAge = 0; 
    for (var i in input) { 
    if (afterAge) { 
     obj2[i] = input[i]; 
    } else { 
     obj1[i] = input[i]; 
    } 

    if (i == "age") { 
     afterAge = true; 
    } 
    } 
} 


splitAtAge(obj); 

Es Schleifen durch das Objekt und wenn eine Eigenschaft nach „Alter“ ist, fügt es obj2. Andernfalls wird es zu obj1 hinzugefügt.

Es scheint jedes Mal für mich zu funktionieren, aber ich würde es vermeiden, dies ganz zu tun, wenn ich Sie wäre, weil die Eigenschaften von Objekten nicht wirklich eine Reihenfolge haben sollen.

EDIT: Ich habe gerade festgestellt, dass Sie Angular verwenden, mit denen ich nicht vertraut bin. Dieser reine JS-Code sollte jedoch immer noch funktionieren.

0

Ich weiß, dass Sie nach einer schönen, einfachen Lösung suchen, aber es ist wirklich schwierig, ein neues Objekt zu erstellen, ohne die Schlüssel zu überlisten, um die Werte zu erhalten. Wenn Sie ES6-Syntax verwenden möchten, könnte die folgende Lösung für Sie funktionieren.

var obj = { 
    name:'Jone', 
    age:'23', 
    height:200, 
    weight:400, 
} 

var newObj = Object.keys(obj) 
    .slice(Object.keys(obj).indexOf('age')) 
    .reduce((a, c) => Object.assign(a, { [c]: obj[c] }), {}) 

// newObj = { height: 200, weight: 400 } 

Mit dieser Methode durchlaufen Sie mindestens nur die letzten beiden Schlüssel im Objekt.

+0

Wie ich schon sagte, ich weiß nicht, was drin ist, so Scheibe (2) wird nicht korrekt – Milad

+0

Siehe mein Update. Das sollte genauso funktionieren. – Himmel

Verwandte Themen