2016-08-10 8 views
2

私は、多次元配列から単一の結果を取得し、その結果をオブジェクト配列に含まれる各オブジェクトにプッシュしようとしています。オブジェクト配列内の既存の各オブジェクトに新しいプロパティをプッシュする方法はありますか?

ここは私のコードです。

var data = { 
 
    "questions": ["Q1", "Q2", "Q3"], 
 
    "details": [{ 
 
    "name": "Alex", 
 
    "values": [27, 2, 14] 
 
    }, { 
 
    "name": "Bill", 
 
    "values": [40, 94, 18] 
 
    }, { 
 
    "name": "Gary", 
 
    "values": [64, 32, 45] 
 
    }] 
 
} 
 

 
var question = "Q1"; 
 
var singleResult = []; 
 

 
for (var i = 0; i < data.details.length; i++) { 
 
    var qIndex = data.questions.indexOf(question) 
 
    singleResult.push(data.details[i].values[qIndex]) 
 
} 
 

 
for (var i = 0; i < singleResult.length; i++) { 
 
    data.details.push({ 
 
    single: singleResult[i] 
 
    }) 
 
} 
 

 
console.log(data.details)

あなたはそれがのように代わりに私は、既存の3つのオブジェクトのそれぞれの中に押し込まれる単一の結果をご希望の配列に新しいオブジェクトを推進している見ることができるように。

私の新しい配列は次のようになります。

[{ 
    "name": "Alex", 
    "values": [27, 2, 14], 
    "single": 27 
}, { 
    "name": "Bill", 
    "values": [40, 94, 18], 
    "single": 40 

}, { 
    "name": "Gary", 
    "values": [64, 32, 45], 
    "single": 64 
}] 

私は.concatでループを実行すると、トリックを行うだろうと思ったが、悲しいことに、それはそうではありませんでした(少なくとも私のために!)。

希望があれば、どんなヘルプやアドバイスもありがとうございます。

答えて

2

indexOf()を使用して質問のインデックスを取得し、次にmap()を使用して変更された配列を取得できます。

var data = {"questions":["Q1","Q2","Q3"],"details":[{"name":"Alex","values":[27,2,14]},{"name":"Bill","values":[40,94,18]},{"name":"Gary","values":[64,32,45]}]} 
 

 
var question = "Q1"; 
 
var qIndex = data.questions.indexOf(question); 
 

 
var result = data.details.map(function(e) { 
 
    var o = JSON.parse(JSON.stringify(e)); 
 
    o.single = e.values[qIndex]; 
 
    return o; 
 
}); 
 

 
console.log(result);

2

私はこのようにそれをリファクタリングします:

var data = { 
 
    "questions": ["Q1", "Q2", "Q3"], 
 
    "details": [{ 
 
    "name": "Alex", 
 
    "values": [27, 2, 14] 
 
    }, { 
 
    "name": "Bill", 
 
    "values": [40, 94, 18] 
 
    }, { 
 
    "name": "Gary", 
 
    "values": [64, 32, 45] 
 
    }] 
 
} 
 

 
var question = "Q1"; 
 

 
var qIndex = data.questions.indexOf(question) 
 
data.details.forEach((obj) => { 
 
    obj.single = obj.values[qIndex]; 
 
}); 
 

 
console.log(data.details)

ハイライト:

  1. あなたqIndexがループの外で行われるべきで取得 - それは関係なく同じままないよう何。
  2. forループの代わりにforEachループを使用することは、コードをきれいにして読みやすくするための個人的な好みです。
  3. singleResult配列は、ここでは不要です。基本オブジェクトがフィールドsingleで詳細に拡張されただけなので、完全に削除しました。
1

var data = { 
 
    "questions": ["Q1", "Q2", "Q3"], 
 
    "details": [{ 
 
    "name": "Alex", 
 
    "values": [27, 2, 14] 
 
    }, { 
 
    "name": "Bill", 
 
    "values": [40, 94, 18] 
 
    }, { 
 
    "name": "Gary", 
 
    "values": [64, 32, 45] 
 
    }] 
 
} 
 

 
var question = "Q1"; 
 
var singleResult = []; 
 

 
for (var i = 0; i < data.details.length; i++) { 
 
    var qIndex = data.questions.indexOf(question) 
 
    singleResult.push(data.details[i].values[qIndex]) 
 
} 
 

 
for (var i = 0; i < singleResult.length; i++) { 
 
    data.details[i].single = singleResult[i]; 
 
} 
 

 
console.log(data.details)

1

var data = {"questions": ["Q1", "Q2", "Q3"],"details": [{"name": "Alex","values": [27, 2, 14]}, {"name": "Bill","values": [40, 94, 18]}, {"name": "Gary","values": [64, 32, 45]}]}, 
 
    question = "Q1", 
 
    qIndex = data.questions.indexOf(question); 
 

 
for (var i = 0, len = data.details.length; i < len; i++) { 
 
    data.details[i].single = data.details[i].values[qIndex]; 
 
} 
 

 
console.log(data.details);

関連する問題