2016-05-27 14 views
1

私はUIテーブルに表示するオブジェクトの配列を持っています。名前、連絡先、およびIDを持つ3つの列があります。オブジェクトの配列に値を追加

[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 

ここでは、テーブルの上部に新しい行を追加します。したがって、オブジェクトの配列に新たに追加された行は、次のようになります。

[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 

私はオブジェクトの配列を上記のように表示する必要があります。

[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 

唯一の変更は、0番目のオブジェクトのid値です。私は4としてそれを入力したことを見ることができます。それはIDのオブジェクトの配列の最大値をチェックします。この場合、3になります。したがって、1だけインクリメントされ、新しく追加された行のid値になります。

これを達成する方法を教えてもらえますか?

もう1つ質問がありました。

私のIDの値は次のとおりです。

1 
2 
3 
4 
5 
6 

と私は4と5のように、新しい行がここ

1 
2 
5 
6 

になります削除は、それが4として、最大長さをチェックして、新しく行に5のid値を追加します。これはいくらかのように見えます。

5 
1 
2 
5 
6 

この場合、5が繰り返されます。私はこれを望んでいない。私は代わりに、idに与えられた最高の値がどれであるのかを見たいと思います。だから、このように見えるはずです。

7 
1 
2 
5 
6 

答えて

-1

あなただけのIDが一意であることを気にしている場合、あなたは

があなたの配列が呼び出されることを前提としていますIDとタイムスタンプを追加することができますpeopleContact オブジェクトの配列に項目を追加するコードは、次のようになります。

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

peopleContact.push(person); 
+0

うわー。これを決して考えなかった。私の場合はこれが最善のことです。 – Patrick

+0

これがあなたの答えだと思うなら、それを合格とマークします。別の質問がある場合は、お尋ねください。 – pparas

+2

@パトリック:同じミリ秒間に複数のオブジェクトをアレイに押し込まないことを保証できますか? –

3

あなたが(それは自明常に配列の長さに等しくないと仮定して)次の利用可能な最高のIDを見つけるために、これを使用することができます:myArrayは、あなたの配列をある

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

あなたが使用することができES6で

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

とにかく繰り返す場合は、「.reduce()」を使用してください。関数内の最大値を単に決定するのではなく、値の配列を 'Math.max'に渡す関数を少し無駄に使っているようです。 –

+1

@squintわかりましたが、おそらく理解するのは難しいでしょう。空の配列が渡された場合、 'Math.max'バージョンに問題があることも示しています。うーん... – Alnitak

+0

@ squint-私はちょうど最大長を取った場合に問題があったので、私の質問を編集しました。この新しいテストケースを解決する方法を教えてください。 – Patrick

4

私が正しくあなたを理解していれば、あなたは単に実行したい:

array[0].id = array.length; 

すぐに行を追加した後。行のことを示し、あなたの編集に対応して

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

EDIT:それが追加されたときに別の方法として、あなたは新しい行を表すオブジェクトの値を制御することができれば、あなたはと行を追加することができます配列を削除することができます。

この場合、ID値を取得するにはいくつかのオプションがあります。

1つは、削除時に配列のすべてのメンバーを調べ、削除された行より大きなIDを持つすべての行のIDを減らすことです。これはおそらく最良の解決策です。

例コード:

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; 
    } 
    } 
} 

何らかの理由で、これはオプションではありません、場合、私はそれで最高のIDを見つけるために、配列を反復処理し、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}); 
を追加reccommendう
+1

第2のアプローチでは 'array.length - 1'? ;) – talemyn

+1

いいえ、OPの質問を見てください。彼のIDは何らかの理由で1つのインデックスに登録されています。また、2番目のアプローチでは、いいえ、+1です。それについて考える。最初の項目を追加すると、配列の長さは0になりますが、目的のIDは1になります。 –

+0

ああ、大丈夫です。 。 。私はあなたの説明を誤解しました。 。 。私の悪い(すなわち、私は「それが追加された時」=「それはすでに追加されている」と思った)。そして、私は数学を台無しにしました。 。 。あのね 。 。 。それを無視してください。 :D – talemyn

関連する問題