在javascript中找到数组的中值(8个值或9个值)

8 javascript arrays jquery

如何在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)

编辑我已经将代码与我原来的可读性答案进行了比较,并且包含了(令我惊讶的)惯例,即偶数长度集的中位数是中间两侧的两个元素的平均值.


Mri*_*jay 6

这里有两件事你要小心.

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.


Har*_*ens 6

对于数字数组,例如 [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)

代码在做什么:

  1. 对数字进行排序,以便按值顺序排列。
  2. 找出数组中的中位数索引。如果数组的长度是偶数,则中位数是索引两侧的两个数字的平均值。
  3. 对于奇数长度的数组,很容易取出中间的数字。但是对于偶数长度的数组,不是。因此,您要进行测试以找出数组的长度是奇数还是偶数,方法是找出数组的长度除以2是否返回整数。如果是整数,则意味着数组的长度是偶数,您必须计算中位数两侧的两个数字的平均值。

在您的问题中,您的数组可以像这样展平:

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)