如何在javascript中找到数组的中值
这是我的阵列
var data = [
{ values: 4 },
{ values: 4 },
{ values: 4 },
{ values: 5 },
{ values: 2 },
{ values: 6 },
{ values: 6 },
{ values: 5 }
];
Run Code Online (Sandbox Code Playgroud)
我试过这段代码
function findMedian(m) {
var middle = m.length - 1 / 2;
if (m.length - 1 % 2 == 1) {
return m[middle];
} else {
return (m[middle - 1] + m[middle]) / 2.0;
}
}
Run Code Online (Sandbox Code Playgroud)
但它的回报NaN价值
我的计算公式是
找到数据的中位数.按升序排列数据.然后,在计算中位数时标记我们考虑其值的地方.
Aln*_*tak 11
这将满足您的需求 - 目前您没有逻辑可以应对.values从数组的每个元素中读取字段:
function findMedian(data) {
// extract the .values field and sort the resulting array
var m = data.map(function(v) {
return v.values;
}).sort(function(a, b) {
return a - b;
});
var middle = Math.floor((m.length - 1) / 2); // NB: operator precedence
if (m.length % 2) {
return m[middle];
} else {
return (m[middle] + m[middle + 1]) / 2.0;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑我已经将代码与我原来的可读性答案进行了比较,并且包含了(令我惊讶的)惯例,即偶数长度集的中位数是中间两侧的两个元素的平均值.
这里有两件事你要小心.
1)运算符优先级
当你说的时候
var middle = m.length - 1 / 2;
Run Code Online (Sandbox Code Playgroud)
它是一样的
var middle = m.length - 0.5; //Because / has much precedence than -
Run Code Online (Sandbox Code Playgroud)
所以你应该说
var middle = (m.length - 1) / 2;
Run Code Online (Sandbox Code Playgroud)
同样的问题 m.length - 1 % 2
2)你没有四舍五入middle所以它正在寻找数组中的十进制索引.我认为会回归undefined.
对于数字数组,例如 [1,6,3,9,28,...]
// calculate the median
function median(arr){
arr.sort(function(a, b){ return a - b; });
var i = arr.length / 2;
return i % 1 == 0 ? (arr[i - 1] + arr[i]) / 2 : arr[Math.floor(i)];
}
Run Code Online (Sandbox Code Playgroud)
代码在做什么:
在您的问题中,您的数组可以像这样展平:
var myArray = data.map(function(d){ return d.values; });
Run Code Online (Sandbox Code Playgroud)
要获得中位数,请使用上面的函数,如下所示:
var myMedian = median(myArray); // 4.5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12389 次 |
| 最近记录: |