javascript - JavaScript作业题中的自定义排序

标签 javascript arrays sorting

编写一个名为 sort_by_average_rating 的函数,它将键值存储列表/数组作为参数,其中每个键值存储都有键 ratingsbudget box_office,其中 budgetbox_office 是整数,ratings 是整数列表。根据 ratings 中值的平均值对输入进行排序。

当键等于 ["ratings"] 时,我尝试在 for 循环中添加所有内容,然后,我对两个 for 循环的结果进行平均。最后,我使用了一个单独的函数来对所有内容进行排序。

function key(a,b){
  for(var i = 0; i < a.length; i++){
    tol1 += a[i]["ratings"];  

  for(var x = 0; x < b.length; x++) {
    tol2 += b[x]["ratings"];
    }
    var average = (tol1/tol2);
  }
  return average;
}

function key(x,y){
  if (x[key] < x[key]) { return -1; }
  if (y[key] > y[key]) { return 1; }
  return 0;
 }

function sort_by_average_rating(b){
  b.sort(key)
 }

结果:

[
    {'box_office': 12574015, 'budget': 3986053.18, 'ratings': [8, 7, 1]}, 
    {'box_office': 44855251, 'budget': 3301717.62, 'ratings': [7, 1, 1]}, 
    {'box_office': 36625133, 'budget': 8678591, 'ratings': [7, 6, 2, 8]}, 
    {'box_office': 48397691, 'budget': 15916122.88, 'ratings': [7, 3, 8, 8, 6, 8]}, 
    {'box_office': 43344800, 'budget': 4373679.25, 'ratings': [1, 1, 7, 4]}
]

预期:

[
    {'box_office': 44855251, 'budget': 3301717.62, 'ratings': [7, 1, 1]}, 
    {'box_office': 43344800, 'budget': 4373679.25, 'ratings': [1, 1, 7, 4]}, 
    {'box_office': 12574015, 'budget': 3986053.18, 'ratings': [8, 7, 1]}, 
    {'box_office': 36625133, 'budget': 8678591.0, 'ratings': [7, 6, 2, 8]}, 
    {'box_office': 48397691, 'budget': 15916122.88, 'ratings': [7, 3, 8, 8, 6, 8]}
]

最佳答案

一个可能的解决方案是创建一个返回ratings 数组的average 的函数,我们将使用Array.reduce()。对于这个。然后你可以使用内置的 Array.sort() 这个新函数生成您想要的结果:

const input = [
  {'box_office': 12574015, 'budget': 3986053.18, 'ratings': [8, 7, 1]},
  {'box_office': 44855251, 'budget': 3301717.62, 'ratings': [7, 1, 1]},
  {'box_office': 36625133, 'budget': 8678591, 'ratings': [7, 6, 2, 8]},
  {'box_office': 48397691, 'budget': 15916122.88, 'ratings': [7, 3, 8, 8, 6, 8]},
  {'box_office': 43344800, 'budget': 4373679.25, 'ratings': [1, 1, 7, 4]}
];

const getAverage = (arr) =>
{
    return (Array.isArray(arr) && arr.length > 0) ?
           arr.reduce((acc, n) => acc + n) / arr.length :
           0;
};

input.sort((a, b) => getAverage(a.ratings) - getAverage(b.ratings));
console.log(input);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

为避免原始数据发生突变,请使用:

let sorted = input.slice().sort((a, b) => getAverage(a.ratings) - getAverage(b.ratings));

关于javascript - JavaScript作业题中的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55817154/

相关文章:

c++ - C++中用指针删除数组--多维与多指针--C++

arrays - 如何在 PostgreSQL 12 中将元素添加到 jsonb 数组中?

vba - 记录宏未记录正确的排序代码(与手动记录的结果不同)

python - 基于子列表中的字母数字字符串的列表列表的自然排序?

javascript - Node.js - "Cannot find module ' module.js'“

javascript - 我怎样才能让 Zemanta 和 Redactor 一起工作?

c++ - 我们如何让我们的 C++ 程序自行修复数组索引超出范围?

c - 结构体节点指针赋值

javascript - 如何创建带有不同样式单词的 html 选项标签?

javascript - React Native Navigator - 屏幕总是空白