2016-06-22 4 views
0

配列にデータを挿入しようとしています。データは2つのプロパティの名前と値を持つオブジェクトフォームです。私は完全に異なる構造を持つ異なる配列オブジェクトからデータを取得しています。JavaScriptでオブジェクトのプロパティの値を繰り返さずに配列にオブジェクトを追加する方法はありますか?

私が作成しています新しい配列は以下の通りである:私はしたくない

var newarray = []; 
for (var i = 0; i < oldarray.length; i++) { 
    a = newarray.indexOf(oldarray[i].studentname); 
    if (a == -1) { 
     newarray.push({ 
      name: oldarray[i].studentname, 
      value: oldarray[i].marks 
     }) 
    } 
} 

Object = {name: "abc", value: "12"}

これは私が私の目的のためにやっているものです

newarray = [Object, Object, Object] 

学生名が繰り返されるので、配列内の名前の出現を調べるためにindexOfを使用しようとしました。しかし、私は正しくそれをやっていません。私は間違って何をしていますか?

+0

それは英語が母国語ではありません(*絶対に大丈夫です*、完璧な英語が** **必要ありません)ことは明らかだので、私は言及します:「してくださいと言っ質問の終わりに「是正」することは、大多数の英語読者にとっては非常に失礼である。 (インドの亜大陸の方言ではよく見かける "チェックしてください"といっても、アメリカ人には無礼と読む。) –

+0

「正しく行っていない」とはどういう意味ですか?何か間違っていると言ってください。理想的には、配列の例、必要な出力、代わりに得られる出力を表示します。 –

答えて

0
var newarray= []; 
for(var i=0; i<oldarray.length; i++) 
{ 
    var found = false; 
    for (var j=0; j<newarray.length; j++) { 
     if (oldarray[i].studentname == newarray[j].studentname) { 
     found = true; 
     break; 
     } 
    } 
    if(!found) 
    { 
     newarray.push({ 
      name : oldarray[i].studentname, 
      value :oldarray[i].marks 
     }); 
    } 
} 
0

このコード:

a = newarray.indexOf(oldarray[i].studentname); 
if (a == -1) 

は、生徒の名前は、アレイ内のエントリがあるかどうかを確認します。しかし、あなたが配列に入れているエントリは単に名前ではなく、オブジェクトです。

同じ名前のオブジェクトが配列である場合に検索したい場合は、Array#someを使用することができます。

if (!newarray.some(function(entry) { return entry.name == oldarray[i].studentname; })) { 
    // It's not there, add it 
} 

各エントリのそのコールバックを呼び出しArray#some。コールバックが真偽値を返した場合、someは停止し、trueを返します。コールバックが真理値を返さない場合(または配列が空の場合)、somefalseを返します。

あなたはES2015を使用している場合は、もう少し簡潔なES2015である:

if (!newarray.some(entry => entry.name == oldarray[i].studentname)) { 
    // It's not there, add it 
} 

==は、名前はもちろん、同じ大文字と小文字であることが必要になります。それが真実でない場合は、まず両側を下(または上)にしたい場合があります。


私はあなたがThe Horror of Implicit Globalsに獲物を落下していないことを確認し、どこでも宣言aが表示されません。

-1

var newarray = []; 
 
for (var i = 0; i < oldarray.length; i++) { 
 
    a = findWithAttr(newarray, "studentname", oldarray[i].studentname); 
 
    if (a == undefined) { 
 
    newarray.push({ 
 
     name: oldarray[i].studentname, 
 
     value: oldarray[i].marks 
 
    }) 
 
    } 
 
} 
 

 
function findWithAttr(array, attr, value) { 
 
    for (var i = 0; i < array.length; i += 1) { 
 
    if (array[i][attr] === value) { 
 
     return i; 
 
    } 
 
    } 
 
}

関連する問題