2014-05-08 23 views
0

我有對象的兩個數組:的JavaScript:2個提問對JSON數據操作

data = [ 
     {"value": 10.2, "cat": "A", "state": "MA"}, 
     {"value": 5.3, "cat": "B", "state": "MA"}, 
     {"value": 20.1, "cat": "A", "state": "NY"}, 
     {"value": 17.3, "cat": "B", "state": "NY"}, 
     {"value": 7.7, "cat": "A", "state": "CT"}, 
     {"value": 11.3, "cat": "B", "state": "CT"} 
     ]; 

reference = [ 
      {"state": "MA", "increment": 4.1}, 
      {"state": "NY", "increment": 0.3}, 
      {"state": "CT", "increment": 20.6} 
      ]; 

問題

  1. 我怎麼能拉離reference所有state域,但沒有一個循環?具體而言,像這樣的函數reference.pullElement("state")返回類似於["MA", "NY", "CT"]的東西。這是否存在?我是否必須創建一個reference對象並在方法中構建以下邏輯?

    var states = []; for (var i = 0; i < reference.length; i++) { states.push(reference[i]["state"]); }

  2. 我怎樣才能在increment字段添加從referencevaluedata,這樣我就可以有一個新的陣列是這樣的。

    output = [ {"value": 14.3, "cat": "A", "state": "MA"}, {"value": 9.4, "cat": "B", "state": "MA"}, {"value": 20.4, "cat": "A", "state": "NY"}, {"value": 17.6, "cat": "B", "state": "NY"}, {"value": 28.3, "cat": "A", "state": "CT"}, {"value": 31.9, "cat": "B", "state": "CT"} ];

我試圖做的問題2以下,但實際的數據有很多種類較多莫過於此。這是最有效的方法嗎?

var output = data.slice(); 
for (var i = 0; i < data.length; i++) { 
    for (var j = 0; j < reference.length; j++) { 
     if (data[i]["state"] == reference[j]["state"]) { 
      output[i]["value"] = data[i]["value"] + reference[j]["increment"]; 
     } 
    } 
} 

謝謝!

+1

你不要使用庫像下劃線做到這一點,或者你需要從頭開始的解決方案? –

+0

Q1:[Array.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)。請注意,在內部,當然,您無法避免循環收集。 –

+0

Q2:使用'state'作爲key和'increment'作爲value,將'reference'轉換爲一個對象。現在,您可以使用狀態鍵查找增量並避免嵌套循環。 –

回答

2

如果您能夠使用陣列上現在可用的(相對較新的)方法,則可以執行以下操作。

1.

// Produce an array of state strings 
var states = reference.map(function(el) { return el.state; }); 

2.

// Produce an object with state strings as keys and increments as the values 
var stateIncMap = reference.reduce(function(items, item) { 
    items[item.state] = item.increment; 
    return items; 
}, {}); 

// Here's an alternate version of the above, using forEach() instead of reduce(): 
// var stateIncMap = {}; 
// reference.forEach(function(el) { 
//  stateIncMap[el.state] = el.increment; 
// }); 

// Update elements' values using the increments 
data.forEach(function(el) { 
    el.value += stateIncMap[el.state]; 
}); 

http://jsfiddle.net/vY5Sr/