【问题标题】:Javascript object sort works only sometimesJavascript 对象排序仅在某些时候有效
【发布时间】:2018-02-19 05:25:28
【问题描述】:

我的 ajax 调用返回一个 有时 可排序的 javascript 对象。有时是因为它有时确实有效,有时则无效。我不知道为什么。当它不起作用时,我会得到这个。

未捕获的类型错误:cars.sort 不是函数

我已将返回数据类型指定为始终为 json。 console.log(typeof cars) 总是返回object,无论排序是否有效。 由于这是在成功声明中,因此可以安全地假设每次都加载汽车,因此这不是异步问题。我读了这个answer 并决定尝试[].sort.call(cars).sort(sort_timestamp) 但它不起作用。我真的迷失了为什么cars.sort 有时而不是总是有效。 sort_timestamp 是一个按汽车对象的时间戳字段排序的函数。

$.ajax({
    url: url, 
    dataType: 'json',
    success: function (cars) {
        console.log(typeof cars); // prints the word 'object'
        cars.sort(sort_timestamp);

        // I tried these as well. They also only work sometimes
        // cars.sort((a, b) => a.timestamp - b.timestamp);
        // [].sort.call(cars).sort(sort_timestamp);
    }
});

【问题讨论】:

  • console.log(Array.isArray(cars)) 向您展示了什么?所有数组都是对象,但并非所有对象都是数组。返回 JSON 的服务器端代码似乎并不总是返回一个数组 - 你能显示该代码的相关部分吗?
  • 您可以使用开发工具进行检查并转到网络选项卡,然后查看调用 ajax 时来自服务器的response 是什么?在它不起作用的那一刻
  • @nnnnnn 工作时显示 true,不工作时显示 false。如果对象实际上没有改变,怎么会发生这种情况
  • 使用console.log(JSON.stringify(cars)) 向我们展示结果是什么时候有效,什么时候无效 - 它们必须不同,否则您将不会得到您所描述的行为。在我看来,问题出在服务器端。
  • @antoni 当它不起作用时响应是{}

标签: javascript jquery ajax sorting object


【解决方案1】:

sortArray [] 而不是 object {} 的方法。

要解决您的问题,您有两种选择:

  • 修复您的后端服务以确保始终返回您想要排序的Array

  • Object 转换为Array

为了安全地检查变量是否为Object,您不能使用typeof,因为它对Array and Object 两种类型都返回object

使用:Object.prototype.toString.call( THEVARIABLEYOUWANTTOBECHECKED )

$.ajax({
    url: url, 
    dataType: 'json',
    success: function (cars) {
      // check if cars is an object
      if (Object.prototype.toString.call(cars) == "[object Object]")
      {
        var result = [];
        var keys   = Object.keys(cars);
        // then convert to an array;
        for (var i = 0; i < keys.length; i++)
        {
          var key = keys[i];
          result.push(cars[key]);
        }

        cars = result;

        // then sort
        cars.sort();
      }
    }
});

希望对你有帮助

【讨论】:

  • 你为什么不用Array.isArray()
  • 当然,如果排序有效,它将不起作用,因为如果排序有效,它会返回 Array 而不是 ObjectArraysort 的方法,而 Object 没有。为确保 WILL 始终有效,您需要将其转换为 Array 以使用 sort 创建自己的 sort 可以对对象进行排序的函数
  • @masterpreenz 我看到你在这里做了什么,但是keys = Object.keys(cars) isn't actually 在操作后获取键和结果停留在[]
  • Object.keys(cars) 仅获取对象的所有第一级属性,如果您将cars 中的内容也放入其中,它会更简单。我们都在这里假设你没有指定
猜你喜欢
  • 2012-02-11
  • 2015-10-04
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2020-06-01
  • 2018-12-11
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多