如何在嵌套对象数组中查找范围
How to find the extents in an array of nested objects?
我有一个嵌套对象数组,其中包含每个州每年的GDP、收入、人口等值:
// The "records" array looks like this:
[
{
name : "...",
income : [
[1995, 1234], // [year, value]
[1996. 1235],
[...]
],
GDP : [
[1995, 1234],
[1996. 1235],
[...]
],
population : [
[1995, 1234],
[1996. 1235],
[...]
]
}, {
name : "...",
income : [
[...]
],
GDP : [
[...]
],
population : [
[...]
]
}, {
...
}
]
现在,我想找到所有状态和年份中每个维度的最小值和最大值。
populationExtents = [659651, 82536680];
gdpExtents = [14250, 2498800];
incomeExtents = [..., ...];
如何在不必多次遍历整个数组的情况下完成此操作?目前,我正在为每个维度做这件事:
var income = records.map(function(d, i) {
return d.income;
});
var min = d3.min(income, function(d, i) {
return d3.min(d, function(e) {
return e[1]; // returns values of each year
});
});
var max = d3.max(income, function(d, i) {
return d3.max(d, function(e) {
return e[1];
});
});
但我认为这太复杂了,因为我应该能够计算每个维度和状态的所有"局部"最小值,然后一次性计算所有状态的全局最小值(而不是每个维度一次(。
我尝试了几个级别的d3.map和嵌套的d3.min,但无法理解这个结构。
function getMaxMin( prop ) {
var concat = [].concat,
arr = concat.apply([], records.map(function(value) {
return concat.apply([], value[prop]);
}));
return [ Math.min.apply(Math.min, arr), Math.max.apply(Math.max, arr) ];
}
或者更漂亮一点:
function getMaxMin( prop ) {
var arr = [];
records.map(function(value) {
arr = arr.concat.apply(arr, value[prop][1]);
});
return [ Math.min.apply(Math.min, arr), Math.max.apply(Math.max, arr) ];
}
编辑:排除年份[year, value]
并将几乎所有内容置于同一循环下:
function getMaxMin() {
var arrs = [];
records.map(function(value) {
arrs[0] = arrs[0].concat(value.income);
arrs[1] = arrs[1].concat(value.GDP);
arrs[2] = arrs[2].concat(value.population);
});
arrs[0] = arrs[0].filter(c);
arrs[1] = arrs[1].filter(c);
arrs[2] = arrs[2].filter(c);
function c(value, key) {
return key % 2;
}
return [
[ Math.min.apply(Math.min, arrs[0]), Math.max.apply(Math.max, arrs[0]) ],
[ Math.min.apply(Math.min, arrs[1]), Math.max.apply(Math.max, arrs[1]) ],
[ Math.min.apply(Math.min, arrs[2]), Math.max.apply(Math.max, arrs[2]) ]
];
}
var maxMin = getMaxMin();
maxMin === [
[income-min, income-max],
[GDP-min, GDP-max],
[population-min, population-max]
]
演示:http://jsbin.com/ecineg/1/embed?javascript,控制台
您可以将JavaScript的Math.max
和Math.min
函数与apply
一起使用,以获取数组的最大值和最小值。为了获得数组,我使用reduce
并连接每个记录的属性
var allValues = function (property) {
return records.reduce(function (memo, record) {
return memo.concat(record[property])
}, [])
}
var allIncome = allValues('income')
Math.max.apply(null, allIncome)
Math.min.apply(null, allIncome)
相关文章:
- 正在全局范围中查找JavaScript函数
- 在对象数组中查找多个值的d3范围
- JS:从数组中查找特定范围内的最低/最高数字
- 范围错误与 mongo 进行$near查找
- 查找某个日期范围内的可用天数
- 在日期范围内查找丢失日期的最有效方法是什么
- XML查询日期范围查找
- 在(跨浏览器)JavaScript 中,何时必须在局部范围内缓存变量查找
- 在 d3 中查找多个数据维度的范围
- 与“未定义”进行比较是否仍会进行全局范围查找
- 为什么JavaScript在第二种情况下不查找全局范围
- Keystone.js嵌套承诺 -> foreach -> 列表查找范围问题
- 正则表达式用于在 JavaScript 中查找任何两个数值(范围)之间的所有数字
- 如何在 d3 中查找给定范围内的数据点数
- MongoDB按日期范围查找文档-JavaScript
- Webkit列可查找可见文本的范围
- 查找范围数组中的重叠部分,并使用新的分块范围构建一个新数组
- 使用Javascript查找范围值的索引
- 在数组中查找范围
- 如何在嵌套对象数组中查找范围