在javascript中从数组中查找中值(8个值或9个值)
如何在javascript中从数组中找到中值 这是我的阵列在javascript中从数组中查找中值(8个值或9个值),javascript,jquery,arrays,Javascript,Jquery,Arrays,如何在javascript中从数组中找到中值 这是我的阵列 var data = [ { values: 4 }, { values: 4 }, { values: 4 }, { values: 5 }, { values: 2 }, { values: 6 }, { values: 6 }, { values: 5 } ]; 我试过这个密码 function findMedian(m) {
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
value
我的计算公式是
找出数据的中位数。按升序排列数据的数量。然后,在计算中值时,标记我们考虑其值的位置
这里有两件事你必须小心 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
,所以它在数组中查找十进制索引。我认为它将返回未定义的这将满足您的需要-目前您没有逻辑来处理从数组的每个元素中读取。值字段:
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;
}
}
编辑为了可读性,与我的原始答案相比,我对代码做了一些补充,并包括了(令我惊讶的)偶数长度集的中位数是中间两边两个元素的平均值的约定。这里有一个代码片段,允许您生成偶数或奇数长度的数字数组。然后,代码段对数组进行排序并计算中值,最后打印排序后的数组和中值
(函数(){
函数makeNumArray(isEven){
var randomNumArr=[];
var限值=isEven?8:9;
对于(变量i=0;i'+'中值为:'+resultArr[1]。toString()+'';
if(!document.querySelector('#sortedardiv')){
presentDiv.insertAdjacentHTML('afterbegin',stringInsert);
}否则{
document.querySelector(“#sortedardirdiv”).innerHTML=resultar[0]。toString()+”
“+”中位数为:“+resultar[1]。toString();
}
};
函数print偶数(){
printMedian(getMedian(makeNumArray(1));
}
函数printOdd(){
printMedian(getMedian(makeNumArray(0));
}
(document.querySelector(“#doEven”)).addEventListener('click',printfeen',false);
(document.querySelector(“#doOdd”)).addEventListener('click',printOdd',false);
})();代码>
#预设结果{
宽度:70%;
利润率:2%0;
填充:2%;
边框:纯黑;
}
计算长度为偶数(静态长度为8)或奇数(静态长度为9)的数字数组的中值。
用于数字数组,例如[1,6,3,9,28,…]
//计算中值
函数中值(arr){
sort(函数(a,b){返回a-b;});
var i=平均长度/2;
返回i%1==0?(arr[i-1]+arr[i])/2:arr[Math.floor(i)];
}
代码正在执行的操作:
对数字进行排序,使其按值排序
找出数组中中值的索引。如果数组的长度为偶数,则中位数是索引两侧两个数字的平均值
对于奇数长度的数组,很容易提取中间数。但对于偶数长度的数组,情况并非如此。因此,您可以通过将数组的长度除以2是否返回整数来测试数组的长度是奇数还是偶数。如果它是一个整数,这意味着数组的长度是偶数,你必须计算中位数两边两个数字的平均值
在您的问题中,您的阵列可以按如下方式展平:
var myArray = data.map(function(d){ return d.values; });
要获得中值,请使用上面的函数,如下所示:
var myMedian = median(myArray); // 4.5
它返回奇数个数组元素。如果您想知道如何在不使用条件的情况下找到中值,请看:)
当心
/**
*计算数字数组的中值
*@param{Array}arr
*@return{Number}
*/
函数中值(arr){
arr=[…arr].sort((a,b)=>a-b);
返回(arr[arr.length-1>>1]+arr[arr.length>>1])/2;
}
要回答这个问题:
median(data.map(x=>x.values));
中间是十进制数,因此数组[7.5]未定义(索引应为整数,可以使用Math.floor或Math.ceil)。另外,我不知道这个算法是否正确,你在做var middle=m.length-(1/2);(看括号)。除法运算符优先于减法运算符。
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;
}