Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中从数组中查找中值(8个值或9个值)_Javascript_Jquery_Arrays - Fatal编程技术网

在javascript中从数组中查找中值(8个值或9个值)

在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) {

如何在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
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;
    
    }