我有两个对象数组:
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}
];
问题
我怎样才能拉出所有
state
来自reference
的字段没有循环?具体来说,像这样的函数reference.pullElement("state")
返回类似["MA", "NY", "CT"]
的内容。这存在吗?我是否必须创建一个reference
对象并将以下逻辑构建到方法中?var states = []; for (var i = 0; i < reference.length; i++) { states.push(reference[i]["state"]); }
如何添加
increment
来自reference
的字段至value
领域data
,这样我就可以有一个像这样的新数组。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.
// 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];
});
关于JavaScript:关于 JSON 数据操作的 2 个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23550380/