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

时间:2014-08-14 10:18:27

标签: 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 middle = m.length - 1 / 2;
        if (m.length - 1 % 2 == 1) {
            return m[middle];
        } else {
            return (m[middle - 1] + m[middle]) / 2.0;
        }

    }

但它返回NaN

我的计算公式是

  

查找数据的中位数。按升序排列数据。然后,在计算中位数时标记我们考虑其值的地方。

6 个答案:

答案 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)];
}

代码正在做什么:

  1. 对数字进行排序,使其按值排序。
  2. 找出数组中的中位数索引。如果数组的长度是偶数,则中位数是指数两边的两个数字的平均值。
  3. 对于奇数长度的数组,可以很容易地取出中间数字。但对于长度均匀的阵列,它不是。因此,您通过查找是否将数组的长度除以2返回整数来进行测试,以确定您的数组是奇数还是偶数。如果它是一个整数,那意味着数组的长度是偶数,你必须计算中位数两边的两个数字的平均值。
  4. 在你的问题中,你的阵列可以像这样扁平化:

    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;
&#13;
&#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;

}

返回奇数个数组元素。