【问题标题】:how can i get the highest lowest and medium value from an array ..? [closed]我怎样才能从数组中获得最高的最低和中等值..? [关闭]
【发布时间】:2020-06-22 06:31:07
【问题描述】:
[
0: {"carrier": "Spicejet", "value": 2596},
1: {"carrier": "Spicejet", "value": NaN},
2: {"carrier": "Spicejet", "value": 2864},
3: {"carrier": "Indigo", "value": 3000},
4: {"carrier": "Indigo", "value": 5500},
5: {"carrier": "Indigo", "value": 4500}
]

上面的 JSON 值不是静态的。有时它只得到两个“价值”。获取最低、最高和中等值。

[
0: {"carrier": "Spicejet", "value": 2596},
1: {"carrier": "Indigo", "value": 3000},
2: {"carrier": "Indigo", "value": 5500},
]

【问题讨论】:

  • 请添加您的尝试。
  • 你有一个 NaN 在那里。这是故意的吗?这也是 not JSON。那就是调试器变量显示输出。
  • 你的意思是中位数吗?

标签: javascript arrays reactjs


【解决方案1】:

请试试这个

var arr = [
{"carrier": "Spicejet", "value": 2596},
{"carrier": "Spicejet", "value": NaN},
{"carrier": "Spicejet", "value": 2864},
{"carrier": "Indigo", "value": 3000},
{"carrier": "Indigo", "value": 5500},
{"carrier": "Indigo", "value": 4500}
], lowest, highest, medium, dump = [], i, x=0;

// Loop and save to dump to we can handle it
for(i=0; i<arr.length; i++)
{
    // If object not exists
    if(typeof arr[i].value == "undefined") continue;
    
    // Check the bad values
    if(null === arr[i].value || isNaN(arr[i].value) || false === arr[i].value || arr[i].value == undefined) continue;

    // Save to dump
    dump[x]=Number(arr[i].value);
    x++;
}

// Sort it
dump.sort();

// lowest
lowest = dump.shift();

// medium
medium = dump[Math.floor(dump.length / 2)];

// highest
highest = dump.pop();

console.log(lowest);
console.log(medium);
console.log(highest);

您必须首先将您的 JSON 转换为 JavaScript 可以接受的正确数组。当您拥有它时,您会列出所有值并获取结果。你清空数组,从小到大排序,得到你需要的结果。

【讨论】:

  • 这样排序有点不必要。加上 OP 想要结果集中的对象,而不是值。要做到这一点,您必须进一步编写逻辑。
  • 不错的解决方案。只是一件事,数字部分的过滤和映射可以使用map来完成。只是dump = arr.map(({value})=&gt;value).filter(Boolean).sort()
  • 如果对数组进行了排序,为什么还要使用 Math.max 和 Math.min?只需 pop() 和 shift()。 @ABGR 3000 是中位数。 sort() 是获取中位数的最简单方法,它缺少查找和实现中位数选择算法(例如 O(N) 的算法)。
  • @gorak 可能会失败。它将删除 0 值。他的过滤器更正确。
  • @user120242,对,那么我们必须具体===NaN。不过很好抓。 :)
【解决方案2】:

你可以这样做。

var arr = [
{"carrier": "Spicejet", "value": 2596},
{"carrier": "Spicejet", "value": NaN},
{"carrier": "Spicejet", "value": 2864},
{"carrier": "Indigo", "value": 3000},
{"carrier": "Indigo", "value": 5500},
{"carrier": "Indigo", "value": 4500}
]

var filteredArr = arr.filter(i=> i.value && i.value!==0).sort((a, b) => a.value - b.value); //Remove falsy values except 0 and sort the array
const lowest  = filteredArr[0];
const highest = filteredArr[filteredArr.length-1];
const medium = filteredArr[Math.floor(filteredArr.length/2)]

   const res = [lowest, medium, highest];
   console.log(res)

【讨论】:

  • 这不能正常工作。 NaN 处理不当。
  • @user120242 已更新。谢谢
【解决方案3】:

你可以对数组进行排序,这样第一个元素会最小,最后一个元素会最大。

我认为你想要平均值,你可以通过添加所有元素并将其除以数组的长度来做到这一点。

【讨论】:

    【解决方案4】:

    你所说的媒介究竟是什么意思?

    
    const getMax = () => {
      let max = 0
      for( let i = 0; i < arr.length; i++) {
    
        if ( !isNaN(x[i].value) && max < x[i].value) max = x[i].value
      }
      return max
    }
    
    const getMin = () => {
      let min = 0
      for( let i = 0; i < arr.length; i++) {
        if ( !isNaN(x[i].value) && min > x[i].value) min = x[i].value
      }
      return min
    }
    

    【讨论】:

    • 平均值 .. [ 3: {"carrier": "Indigo", "value": 3000} ],
    • avrege = (min + max) / 2
    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2013-04-30
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多