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

如何在javascript中找到数组的中值

这是我的arrays

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

我的计算公式是

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

这将满足您的需求 – 目前您没有逻辑可以处理从数组的每个元素中读取.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)运营商优先权

当你说的时候

 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相同的问题m.length - 1 % 2

2)你没有舍入middle所以它在数组中寻找小数索引。 我认为这将返回undefined

对于一组数字,例如[1,6,3,9,28,...]

 // calculate the median function median(arr){ 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. 对于奇数长度的数组,可以很容易地取出中间数字。 但对于长度均匀的arrays,它不是。 因此,您通过查找将数组的长度除以2是否返回整数来测试以确定您的数组是奇数还是偶数。 如果它是一个整数,则意味着数组的长度是偶数,并且您必须计算中位数两侧的两个数字的平均值。

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

 var myArray = data.map(function(d){ return d.values; }); 

要获得中位数,请使用上面的函数,如下所示:

 var myMedian = median(myArray); // 4.5 

这是一个片段,允许您生成偶数或奇数长度的数字数组。 然后片段对数组进行排序并计算中值,最后打印排序的数组和中位数。

 (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 = '
' + resultArr[0].toString() + '
' + 'the median is: ' + resultArr[1].toString() + '
'; if (!document.querySelector('#sortedArrDiv')) { presentDiv.insertAdjacentHTML('afterbegin', stringInsert); } else { document.querySelector('#sortedArrDiv').innerHTML = resultArr[0].toString() + "
" + '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); })();
 #presentResult { width: 70%; margin: 2% 0; padding: 2%; border: solid black; } 
 

Calculate the median of an array of numbers with even (static length of 8) or odd (static length of 9) length.

 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; } 

它返回奇数个数组元素。