如何使用javascript获取嵌套对象中所有子项的单个属性?

保罗

对于一个交互式地图,该地图显示了一段时间内的国家/地区数据(使用d3),我有一个称为的大对象dataset的属性dataset还是由国家/地区名称标识的对象。下一级是对象,再次由年份表示。最后一层是要显示的数据。结构是这样的:

dataset
    - CountryA
        - 2010
            - population: 4000000
            - crime rate: 17.4
            - GDP per capita: 2800
        - 2011 
            - population: 4100000
            - crime rate: 16.8
            - GDP per capita: 2900
        - ...
    - CountryB
        - 2010
            - population: 3700000
            - crime rate: 25.6
            - GDP per capita: 1200
        - 2011 
            - population: 3850000
            - crime rate: 27.2
            - GDP per capita: 1180
        - ...
    - ...

现在,要更新地图,我需要找到特定属性的范围,以适应我要使用的颜色范围。例如,如果我想获得2010年的犯罪率的最小值和最大值,是否有一个简单的命令来检索该信息?

我确实拥有所有可用国家/地区的列表,当然可以遍历该列表并获取指定年份的值,将其与全局最小值/最大值进行比较,并在必要时进行更改(使用Math.min/max)。我只是想知道,是否有一种简单的方法,例如

var crimeRateLow = getGlobalMin(dataset, 2, "crime rate");

// magic function
function getGlobalMin(object, unspecifiedLevels, indicator) { ... }

我目前正在使用以下函数j作为指标,并且year是全局设置的变量:

function getRange(j) {
  var jRange = {"min": 0, "max": 0};
  for (k in dataset) {
    jRange["min"] = Math.min(jRange["min"], dataset[k][year][j]);
    jRange["max"] = Math.max(jRange["max"], dataset[k][year][j]);
  }
  return jRange;
}
高积云

尽管d3中没有内置功能可以解决您的问题,但d3可能有助于优雅地解决它。

  1. 通过重复应用d3.values()以获得关联数组的属性值数组(静止对象),将嵌套的对象嵌套到包含感兴趣的字段值的较小数组中这些属性值/对象之后mapped是仅包含感兴趣的字段值的数组。

  2. 将这些阵列合并d3.merge()为一个大阵列。

  3. 申请d3.extent()从中获得全局范围(即数组[min,max)。

    function getGlobalExtent(data, field) {
        return d3.extent(     // (3.) Get the global extent.
            d3.merge(     // (2.) Merge all arrays into a single one.
                d3.values(data)     // (1.) Array of all country objects in dataset
                    .map(function(country) {     // (1.) Map each country to array of field values for all years within.
                            return d3.values(country)     // (1.) Array of years in each country
                                        .map(function(year) {     // (1.) Map each year to the requested field value.
                                            return year[field];
                                        });
                    })
            )
        );
    }
    

我整理了一个工作片段:

var dataset = {
    "CountryA": {
        "2010": {
            "population": 4000000,
            "crime rate": 17.4,
            "GDP per capita": 2800
        },
        "2011": {
            "population": 4100000,
            "crime rate": 16.8,
            "GDP per capita": 2900
        }
    },
    "CountryB": {
        "2010": {
            "population": 3700000,
            "crime rate": 25.6,
            "GDP per capita": 1200
        },
        "2011": {
            "population": 3850000,
            "crime rate": 27.2,
            "GDP per capita": 1180
        }
    }
};

function getGlobalExtent(data, field) {
    return d3.extent(     // (3.) Get the global extent.
        d3.merge(     // (2.) Merge all arrays into a single one.
            d3.values(data)     // (1.) Array of all country objects in dataset
                .map(function(country) {     // (1.) Map each country to array of field values for all years within.
                        return d3.values(country)     // (1.) Array of years in each country
                                    .map(function(year) {     // (1.) Map each year to the requested field value.
                                        return year[field];
                                    });
                })
        )
    );
}

// population: 3700000,4100000
//console.log("population:", getGlobalExtent(dataset, "population").join());

// crime rate: 16.8,27.2
//console.log("crime rate:", getGlobalExtent(dataset, "crime rate").join());

// GDP per capita: 1180,2900
//console.log("GDP per capita:", getGlobalExtent(dataset, "GDP per capita").join());
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试使用reduce将数组内对象的嵌套属性合并为包含所有嵌套属性的单个对象,仅获取单个值

如何获取Javascript嵌套对象的所有属性值(不知道键)?

Javascript如何更新嵌套对象中的所有属性名称

如何获取具有嵌套属性的Javascript对象的子集?

如何在javascript中获取文件对象的所有属性?

获取Javascript文件中所有对象的数组

如何获取Oracle树层次结构中所有父项的子项总数?

如何使用 R 的 xml2 包获取 XML 文件中所有属性的名称

如何使用jq获取JSON中所有指定属性的值?

如何使用数组获取对象中所有项目的总长度

如何在单个查询中获取 MySQL 中所有不同项的所有总和

如何替换数组中所有出现的对象键?(JavaScript)

如何获取JS对象中特定嵌套属性的所有值

打字稿从嵌套对象中获取属性的所有值

您如何获取JavaScript中所有班级孩子的列表?

如果在javascript中具有相同ID,如何合并数组中所有属性的两个对象?

使用Javascript获取XML中所有节点的名称

如何获取嵌套数组中所有非嵌套项目的长度?

获取包含yii2中所有相关数据的嵌套json对象

没有使用 Javascript 获取嵌套对象的所有键

使用递归获取嵌套对象中的所有父对象

如何在JavaScript中为Closure Compiler注释嵌套对象,并使所有属性可选?

如何对集合中所有对象的属性执行.Max()并返回具有最大值的对象

JavaScript将所有嵌套对象属性设置为null

如何使用 JavaScript 在 DOM 元素中迭代所有子项,包括那些没有标记的子项

在JavaScript中执行计算后,如何在嵌套数组中获取所有对象?

定义JavaScript对象文字,以便数组中所有对象的属性都存在吗?

父值是嵌套javascript对象中所有子值的总和

Javascript-更改嵌套数组中所有对象键的名称