2016-05-27 17 views
1

Ich habe dieses Array von Objekten, die ich in der UI-Tabelle anzeigen kann. Es hat 3 Spalten mit Name, Kontakt und ID.Wert in ein Array von Objekten einfügen

[Object, Object, Object] 
0:Object 
    name: "Rick" 
    Contact: "Yes" 
    id: 1 
1:Object 
    name:"Anjie" 
    Contact:"No" 
    id: 2 
2:Object 
    name:"dillan" 
    Contact:"Maybe" 
    id:3 

Jetzt füge ich eine neue Zeile an den Anfang der Tabelle. Also würde die neu hinzugefügte Reihe in das Array von Objekten so aussehen.

[Object, Object, Object,Object] 
0:Object //newly added row. Since new row is added, it doesnt have any data. 
name: "" 
Contact: "" 
id: 
1:Object 
name: "Rick" 
Contact: "Yes" 
id: 1 
2:Object 
name:"Anjie" 
Contact:"No" 
id: 2 
3:Object 
name:"dillan" 
Contact:"Maybe" 
id:3 

Ich möchte, dass das Array von Objekten wie folgt aussieht und nicht über einem.

[Object, Object, Object,Object] 
0:Object //newly added row. Since new row is added, it doesnt have any data. 
name: "" 
Contact: "" 
id: 4   
1:Object 
name: "Rick" 
Contact: "Yes" 
id: 1 
2:Object 
name:"Anjie" 
Contact:"No" 
id: 2 
3:Object 
name:"dillan" 
Contact:"Maybe" 
id:3 

Die einzige Änderung ist ID-Wert bei 0-Objekt. Sie können sehen, dass ich es als 4 eingegeben habe. Es wird den Maximalwert in einem Array von Objekten für ID überprüfen. In diesem Fall ist es 3. Es wird also um 1 erhöht und als ID-Wert für die neu hinzugefügte Zeile angegeben.

Kann mir jemand bitte sagen, wie dies zu erreichen ist bitte.

Außerdem hatte ich noch eine Abfrage.

Wenn meine ID-Werte wie folgt sind.

1 
2 
3 
4 
5 
6 

Und ich lösche 4 und 5. So neue Zeilen

1 
2 
5 
6 

hier sein werden, wird es maximale Länge als 4 überprüfen und id-Wert von 5 bis neu Zeile hinzufügen. Es sieht ungefähr so ​​aus.

5 
1 
2 
5 
6 

In diesem Fall wird 5 wiederholt. Ich will das nicht. Ich möchte stattdessen sehen, welcher der höchste Wert ist, der id gegeben wird, und dann die ID entsprechend erhöhen. Also sollte es so aussehen.

7 
1 
2 
5 
6 

Antwort

-1

Wenn Sie nur über die ID eindeutig ist egal, Sie den Zeitstempel als ID peopleContact genannt wird hinzufügen können

Nehmen wir an, dass Ihr Array Ihr Code zum Hinzufügen des Elements im Array von Objekten sieht ungefähr wie folgt aus.

var person= new Object(); 
person.name= ""; 
person.Contact= ""; 
person.id = Date.now(); 

peopleContact.push(person); 
+0

wow. Dachte nie darüber nach. das wäre das Beste für meinen Fall. – Patrick

+0

Wenn Sie denken, dass dies Ihre Antwort ist, dann markieren Sie es als akzeptiert. Wenn Sie eine andere Frage haben, fragen Sie bitte. – pparas

+2

@Patrick: Sind Sie sicher, dass Sie garantieren können, dass Sie während der gleichen Millisekunde niemals mehr als ein Objekt in das Array schieben? –

3

diese Weise können Sie die nächsthöhere ID zur Verfügung finden (unter der Annahme, dass es auf die Länge des Arrays nicht trivialerweise immer gleich ist):

var newID = 1 + myArray.reduce(function(p, c) { 
    return Math.max(c.id, p); 
}, 0); 

wo myArray Ihr Array ist.

In ES6 könnten Sie:

var newID = 1 + myArray.reduce((p, c) => Math.max(c.id, p), 0) 
+1

Wenn Sie sowieso iterieren, warum nicht '.reduce()'? Scheint ein wenig verschwenderisch eine Funktion zu verwenden, um ein Array von Werten an Math.max zu übergeben, anstatt nur den Maximalwert direkt in der Funktion zu bestimmen. –

+1

@squint Ich habe es gezeigt, obwohl es möglicherweise schwieriger zu verstehen ist. Es zeigt auch, dass es ein Problem mit der 'Math.max'-Version gibt, wenn ein leeres Array übergeben wurde. Hmm ... – Alnitak

+0

@ squint- Ich habe meine Frage bearbeitet, da es ein Problem gab, wenn ich nur die maximale Länge genommen habe. Kannst du mir helfen, diesen neuen Testfall zu lösen? – Patrick

4

Wenn ich Sie richtig verstehe, wollen Sie einfach laufen:

array[0].id = array.length; 

unmittelbar nach der Zeile hinzufügen. Alternativ, wenn Sie die Werte des Objekts steuern kann, um die neue Zeile darstellt, wenn es hinzugefügt wird, können Sie die Zeile hinzufügen, wie:

{ 
    name:"", 
    Contact:"", 
    id: array.length + 1 
} 

EDIT:

Als Antwort auf Ihre bearbeiten, die zeigen, dass Reihen von Das Array kann gelöscht werden.

In diesem Fall haben Sie eine Reihe von Optionen, um den ID-Wert zu erhalten.

Eine besteht darin, zum Zeitpunkt des Löschens alle Elemente des Arrays durchzugehen und die ID aller Zeilen zu reduzieren, die eine ID größer als die gelöschte Zeile haben. Dies ist wahrscheinlich die beste Lösung.

Beispielcode:

var delete = function(array, idToDelete) { 
    for(var i = 0; i < array.length; i += 1) { 
    if(array[i].id === idToDelete) { 
     array.splice(i, 1); 
    } else if (array[i].id > idToDelete) { 
     array[i].id = array[i].id - 1; 
    } 
    } 
} 

Wenn aus welchem ​​Grund auch immer, dies ist keine Option, würde ich reccommend durch das Array iterieren in die höchste ID zu finden, und das Hinzufügen von 1.

var newId = array[0].id; 
for(var i = 0; i < array.length; i += 1) { 
    if(array[i].id > newId) { 
    newId = array[i].id; 
    } 
} 
array.splice(0, 0, {name:"", Contact:"", id: newId + 1}); 
+1

'array.length - 1' im zweiten Ansatz? ;) – talemyn

+1

Nein, schau dir OP's Frage an. Seine IDs sind 1-indexiert, aus welchem ​​Grund auch immer. Auch im zweiten Ansatz, nein, es ist +1. Denk darüber nach; Wenn Sie das erste Element hinzufügen, wäre die Länge des Arrays 0, aber die gewünschte ID wäre 1. –

+0

Oh, okay. . . Ich habe deine Beschreibung missverstanden. . . meine schlechte (d. h. ich dachte "wenn es hinzugefügt wird =" es wurde bereits hinzugefügt "). Und dann habe ich die Mathematik vermasselt. . . Weißt du was . . . ignoriere es einfach. : D – talemyn

Verwandte Themen