2017-03-17 77 views
2

我无法从数据集中获取最大值和最小值。我认为这个(// Get the largest value from Json object with Javascript加上Math.min.apply returns 0 for null)最接近我所需要的,但是我的数据有点复杂(至少从我的'初学者的角度来看')。字典数组的最小值和最大值(JSON)

我的数据集的担忧预期寿命从1995年的所有国家,直到2016年看起来是这样的:

[{"country":"Abkhazia","1995":null,"1996":null,"1997":null,"1998":null,"1999":null,"2000":null,"2001":null,"2002":null,"2003":null,"2004":null,"2005":null,"2006":null,"2007":null,"2008":null,"2009":null,"2010":null}, 
{"country":"Afghanistan","1995":null,"1996":null,"1997":null,"1998":null,"1999":null,"2000":null,"2001":null,"2002":5.7,"2003":6.8,"2004":6.4,"2005":6.6,"2006":6.8,"2007":7.3,"2008":7.0,"2009":7.6,"2010":7.6}, 
{"country":"Akrotiri and Dhekelia","1995":null,"1996":null,"1997":null,"1998":null,"1999":null,"2000":null,"2001":null,"2002":null,"2003":null,"2004":null,"2005":null,"2006":null,"2007":null,"2008":null,"2009":null,"2010":null}, 
{"country":"Albania","1995":2.6,"1996":4.0,"1997":4.8,"1998":5.3,"1999":5.8,"2000":6.4,"2001":6.0,"2002":6.3,"2003":6.2,"2004":6.9,"2005":6.8,"2006":6.7,"2007":6.9,"2008":6.7,"2009":6.9,"2010":6.5}, 
etc. 

我需要什么:

的最大值和完整的数据集的最小值。
对于这个例子,这将是:

min: 2.6 
max: 7.6 

我使用D3制作的数据图,我想使用的值创建的颜色范围。

代码我试图

正如介绍中,我想我需要上面给出的两个链接的组合说,但是我不能使它发挥作用。例如,使用第二个链接我可以得到给定国家的最小值,但不是所有国家的最小值。

希望有人能帮助我!

+4

请添加通缉的结果和代码,你试过。 –

+3

一年的最小和最大值?每年都有?按国家? – Weedoze

+0

数组的整体结构使其难以使用 – Laazo

回答

3

你可以遍历所有国家和全键和检查,如果该值不等于null。然后获取minmax的值。

var data = [{ "country": "Abkhazia", "1995": null, "1996": null, "1997": null, "1998": null, "1999": null, "2000": null, "2001": null, "2002": null, "2003": null, "2004": null, "2005": null, "2006": null, "2007": null, "2008": null, "2009": null, "2010": null }, { "country": "Afghanistan", "1995": null, "1996": null, "1997": null, "1998": null, "1999": null, "2000": null, "2001": null, "2002": 5.7, "2003": 6.8, "2004": 6.4, "2005": 6.6, "2006": 6.8, "2007": 7.3, "2008": 7.0, "2009": 7.6, "2010": 7.6 }, { "country": "Akrotiri and Dhekelia", "1995": null, "1996": null, "1997": null, "1998": null, "1999": null, "2000": null, "2001": null, "2002": null, "2003": null, "2004": null, "2005": null, "2006": null, "2007": null, "2008": null, "2009": null, "2010": null }, { "country": "Albania", "1995": 2.6, "1996": 4.0, "1997": 4.8, "1998": 5.3, "1999": 5.8, "2000": 6.4, "2001": 6.0, "2002": 6.3, "2003": 6.2, "2004": 6.9, "2005": 6.8, "2006": 6.7, "2007": 6.9, "2008": 6.7, "2009": 6.9, "2010": 6.5 }], 
 
    min = Number.MAX_VALUE, 
 
    max = -Number.MAX_VALUE; 
 

 
data.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) {     
 
     if (k !== 'country' && o[k] !== null) { 
 
      min = Math.min(min, o[k]); 
 
      max = Math.max(max, o[k]); 
 
     } 
 
    }); 
 
}); 
 

 
console.log(min, max);

0

我假设你想检查你的数组中的所有元素的有效数字,并得到结果数字集的最小/最大值。这是一个代码示例来做到这一点。您可以点击运行以查看结果。

data = [{"country":"Abkhazia","1995":null,"1996":null,"1997":null,"1998":null,"1999":null,"2000":null,"2001":null,"2002":null,"2003":null,"2004":null,"2005":null,"2006":null,"2007":null,"2008":null,"2009":null,"2010":null}, 
 
{"country":"Afghanistan","1995":null,"1996":null,"1997":null,"1998":null,"1999":null,"2000":null,"2001":null,"2002":5.7,"2003":6.8,"2004":6.4,"2005":6.6,"2006":6.8,"2007":7.3,"2008":7.0,"2009":7.6,"2010":7.6}, 
 
{"country":"Akrotiri and Dhekelia","1995":null,"1996":null,"1997":null,"1998":null,"1999":null,"2000":null,"2001":null,"2002":null,"2003":null,"2004":null,"2005":null,"2006":null,"2007":null,"2008":null,"2009":null,"2010":null}, 
 
{"country":"Albania","1995":2.6,"1996":4.0,"1997":4.8,"1998":5.3,"1999":5.8,"2000":6.4,"2001":6.0,"2002":6.3,"2003":6.2,"2004":6.9,"2005":6.8,"2006":6.7,"2007":6.9,"2008":6.7,"2009":6.9,"2010":6.5}]; 
 

 
values = []; 
 

 
for (i in data) { 
 
    for (j in data[i]) { 
 
    if (parseFloat(data[i][j]) > 0) { 
 
     values.push(parseFloat(data[i][j])); 
 
    } 
 
    } 
 
} 
 

 
min = Math.min.apply(null, values); 
 
max = Math.max.apply(null, values); 
 
alert(values) 
 
alert(min); 
 
alert(max);

1

如果你被允许使用ES6:

const maxValue = dataset.reduce((max, obj) => { 
    let ar = [max]; 
    for(const key in obj) { 
     if (isNaN(Number.parseFloat(obj[key]))) continue; 
     ar.push(obj[key]): 
    } 
    return Math.max.apply(ar, Math); 
}, -1)