通过选择下拉列表的JavaScript排序表

时间:2019-11-07 22:02:05

标签: javascript jquery json

我已经从JSON数据中动态渲染了表格,我想通过选择下拉列表按投票和等级(按升/降)对表格进行排序,但是我不确定如何...我尝试了几种不同的方法,但是我总是失败。

                <label for="sort">Sort</label><br>
                <select name="sort" id="sort">
                    <option value="0" selected>Order By</option>
                    <option value="1">Votes Ascending</option>
                    <option value="2">Votes Descending</option>
                    <option value="3">Rating Ascending</option>
                    <option value="4">Rating Descending</option>
                </select>

以下是代码的链接:https://jsfiddle.net/natefr0st/zckrwdaf/

2 个答案:

答案 0 :(得分:0)

为此,您将要使用Array.sort()。您想要进行的任何排序都可以归结为3个主要结果:a > ba < ba = b。它们分别与返回值1-10相对应。因此,实际上唯一的技巧是“ ab是什么?”这就是您必须回答的问题。是选票吗?是名字吗是等级吗?等

这是一个例子:

var objs = [
  {name: "Bob", age: 30},
  {name: "Susan", age: 35},
  {name: "Jennifer", age: 22}
];

function sortByName(a, b, sortAsc = true) {
  var val1 = a.name;
  var val2 = b.name;
  let result = ((val1 < val2) ? -1 : ((val1 > val2) ? 1 : 0));
  if (!sortAsc) {
    result *= -1;
  }
  return result;
}
// sort by name (ascending)
console.log(objs.sort((a, b) => sortByName(a, b, true)));
// sort by name (descending)
console.log(objs.sort((a, b) => sortByName(a, b, false)));

function sortByAge(a, b, sortAsc = true) {
  var val1 = a.age;
  var val2 = b.age;
  let result = ((val1 < val2) ? -1 : ((val1 > val2) ? 1 : 0));
  if (!sortAsc) {
    result *= -1;
  }
  return result;
}
// sort by age (ascending)
console.log(objs.sort((a, b) => sortByAge(a, b, true)));
// sort by age (descending)
console.log(objs.sort((a, b) => sortByAge(a, b, false)));

如您所见,这两个函数(sortByNamesortByAge)之间唯一的不同是在其上建立比较值的属性。使用它,我们可以创建使用这些概念的通用sortByProperty函数。

var objs = [
  {name: "Bob", age: 30},
  {name: "Susan", age: 35},
  {name: "Jennifer", age: 22}
];

function sortByProperty(a, b, property, sortAsc = true) {
  var val1 = a[property];
  var val2 = b[property];
  let result = ((val1 < val2) ? -1 : ((val1 > val2) ? 1 : 0));
  if (!sortAsc) {
    result *= -1;
  }
  return result;
}

function sortByName(items, sortAsc = true) {
  return objs.slice().sort((a, b) => sortByProperty(a, b, "name", sortAsc))
}
// sort by name (ascending) using helper function
console.log(sortByName(objs));
// sort by age (descending) calling sortByProperty directly
console.log(objs.slice().sort((a, b) => sortByProperty(a, b, "age", false)));

从那里开始,看起来好像有了数据集,便知道如何将其放入表中并进行分页等,因此我不会理会它。让我知道您是否有任何疑问!

答案 1 :(得分:0)

我为您添加了一个小提琴示例,并实现了前两个排序选项(“排序依据”,“投票ASC”。我想您可以实现其余的排序选项:)

https://jsfiddle.net/on863L2m/2/

$('#sort').on('change', function() {
    displayMovies(1, $(this).val())
});


switch(sort) {
   case "0":
    movies = movies.sort(function (a, b) {
            return ((a.id < b.id) ? -1 : ((a.id > b.id) ? 1 : 0));
    });
   break;
   case "1":
    movies = movies.sort(function (a, b) {
            return ((a.imdb_votes < b.imdb_votes) ? -1 : ((a.imdb_votes > b.imdb_votes) ? 1 : 0));
    });
   break;
  }