如何在javascript中找到数组的中值?
这是我的数组
var data = [
{ values: 4 },
{ values: 4 },
{ values: 4 },
{ values: 5 },
{ values: 2 },
{ values: 6 },
{ values: 6 },
{ values: 5 }
];
我试过这段代码
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;
}
}
但它返回NaN
值
我的计算公式是
查找数据的中位数。按升序排列数据。然后,在计算中位数时标记我们考虑其值的地方。
答案 0 :(得分: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;
}
}
编辑我的代码与我原来的可读性答案相比,我已经填写了一些代码,并且包含了(令我惊讶的)惯例,即偶数长度集的中位数是中间两侧的两个元素。
答案 1 :(得分:6)
这里有两件事你需要小心。
1)运营商优先级
当你说
时var middle = m.length - 1 / 2;
与
相同 var middle = m.length - 0.5; //Because / has much precedence than -
所以你应该说
var middle = (m.length - 1) / 2;
与m.length - 1 % 2
2)您没有四舍五入middle
所以它正在寻找数组中的小数索引。我认为这将返回undefined
。
答案 2 :(得分:4)
对于一组数字,例如[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)];
}
代码正在做什么:
在你的问题中,你的阵列可以像这样扁平化:
var myArray = data.map(function(d){ return d.values; });
要获得中位数,请使用上面的函数:
var myMedian = median(myArray); // 4.5
答案 3 :(得分:0)
这是一个片段,允许您生成偶数或奇数长度的数字数组。然后片段对数组进行排序并计算中值,最后打印排序的数组和中位数。
(function() {
function makeNumArray(isEven) {
var randomNumArr = [];
var limit = isEven ? 8 : 9;
for (var i = 0; i < limit; i++) {
randomNumArr.push(Math.ceil(Math.random() * 10));
}
return randomNumArr;
}
function getMedian(arrOfNums) {
var result = [];
var sortedArr = arrOfNums.sort(function(num1, num2) {
return num1 - num2;
});
result.push("sortedArr is: [" + sortedArr.toString() + "]");
var medianIndex = Math.floor(sortedArr.length / 2);
if (arrOfNums.length % 2 === 0) {
result.push((sortedArr[medianIndex-1] + sortedArr[medianIndex]) / 2);
return result;
} else {
result.push(sortedArr[medianIndex]);
return result;
}
}
function printMedian(resultArr) {
var presentDiv = document.querySelector('#presentResult');
var stringInsert = '<div id="sortedArrDiv">' + resultArr[0].toString() + '<br>' + 'the median is: ' + resultArr[1].toString() + '</div>';
if (!document.querySelector('#sortedArrDiv')) {
presentDiv.insertAdjacentHTML('afterbegin', stringInsert);
} else {
document.querySelector('#sortedArrDiv').innerHTML = resultArr[0].toString() + "<br>" + 'the median is: ' + resultArr[1].toString();
}
};
function printEven() {
printMedian(getMedian(makeNumArray(1)));
}
function printOdd() {
printMedian(getMedian(makeNumArray(0)));
}
(document.querySelector("#doEven")).addEventListener('click', printEven, false);
(document.querySelector("#doOdd")).addEventListener('click', printOdd, false);
})();
&#13;
#presentResult {
width: 70%;
margin: 2% 0;
padding: 2%;
border: solid black;
}
&#13;
<h4>Calculate the median of an array of numbers with even (static length of 8) or odd (static length of 9) length. </h4>
<input type="button" value="Even length array of random nums" id="doEven">
<input type="button" value="Odd length array of random nums" id="doOdd">
<div id="presentResult"></div>
&#13;
答案 4 :(得分:0)
如果您想知道如何在不使用条件条件的情况下找到中位数,这里就是:)
注意ES6。
/**
* Calculate median of array of numbers
* @param {Array<Number>} arr
* @return {Number}
*/
function median(arr) {
arr = [...arr].sort((a, b) => a - b);
return (arr[arr.length - 1 >> 1] + arr[arr.length >> 1]) / 2;
}
要回答这个问题:
median(data.map(x => x.values));
答案 5 :(得分:-1)
Findmedian(arr) {
arr = arr.sort(function(a, b){ return a - b; });
var i = arr.length / 2;
var result = i % 1 == 0 ? parseInt((arr[i - 1] + arr[i]) / 2) + ',' +
parseInt(arr[i]) : arr[Math.floor(i)];
return result;
}
返回奇数个数组元素。