javascript对使用push方法的对象数组进行排序

javascript对使用push方法的对象数组进行排序,javascript,arrays,sorting,push,Javascript,Arrays,Sorting,Push,我有如下代码。我希望对差异数组进行排序,但当我使用Chrome检查时,差异数组在排序之前和之后是相同的。请任何人指出我的代码中的错误以及排序方法不起作用的原因。看起来它与数组的创建方式(使用push)有关,但不确定哪里出了问题 var differences = []; for (i = 0; i < locations.length; i++) { var myObj = { lat : locations[i].lat, lng

我有如下代码。我希望对差异数组进行排序,但当我使用Chrome检查时,差异数组在排序之前和之后是相同的。请任何人指出我的代码中的错误以及排序方法不起作用的原因。看起来它与数组的创建方式(使用push)有关,但不确定哪里出了问题

var differences = [];

for (i = 0; i < locations.length; i++) {
    var myObj = {
        lat      : locations[i].lat,
        lng      : locations[i].lng,
        distance : locations[i].lng
    };

    differences.push(myObj);
}

function compare(a, b) {
   if (a.distance < b.distance)
       return -1;

   if (a.distance > b.distance)
       return 1;

   return 0;
}

console.log(differences);
differences.sort(compare);
console.log(differences);
var差异=[];
对于(i=0;ib.距离)
返回1;
返回0;
}
控制台日志(差异);
差异。排序(比较);
控制台日志(差异);

输出对象时,Google Chrome的控制台不会将对象转换为字符串。相反,它显示对象的实际内容,如果对象随后发生更改,这些内容将更新

要演示这一点,请打开控制台并输入以下行:

var obj = {};
console.log(obj);
obj.helloWorld = "Hi there";
通过展开
obj
,您可以看到在输出中为其定义了“helloWorld”属性,即使您在将其记录到控制台后添加了该属性

这意味着您的排序功能工作正常。如果要查看前后的差异,可以在记录对象时克隆该对象:

console.log(JSON.parse(JSON.stringify(differences)));

这可能只是chrome的主动性,并在两个日志中显示相同的对象。在第一个日志中,执行以下操作
console.log(JSON.parse(JSON.stringify(differences))此外,在数字上使用Sort时,Sort实际上不是一个稳定的方法,因为Sort方法使用Unicode进行排序。例如,var nums=[2,10];nums.sort();将输出10,2而不是2,10,因为在unicode中,10在unicode点顺序中位于2之前。我建议不要在数字上使用排序。@Korgrue OP使用的是自定义比较函数。您的参数不适用。他的compare函数返回一个数字,该数字被推送到数组中并返回到位。排序方法仍在对数字进行处理,结果不稳定。@Korgrue这是一个多么愚蠢的论点。您认为不应该使用sort来比较-1、0和1,因为它不能正确地对10和2进行排序。这个问题中的compare函数实际上就是MDN文档页面为Array.prototype.sort()推荐的方法,以这种方式使用时效果非常好。我尝试了这个方法,但没有成功。我注意到的另一件事是,当我记录差异数组(排序之前或之后)时,它会返回(在Chrome控制台中)这样的数组[],当我单击它时,它会以0:Object 1:Object等形式展开,其中哪个对象持有各自属性的值。当我尝试记录差异[0]或差异[1]时,它返回未定义的,这看起来很奇怪,因为差异是一个数组。不知道是什么原因造成的behaviour@altin什么不起作用?在排序之前和之后记录数组没有显示它已更改?我无法看到数组中的任何对象。在这两种情况下,它都返回一个空数组。那么我认为您的问题中缺少了一些重要的内容。for循环之前的locations.length是什么?我创建了类似数组的位置,并使用Ajax从端点获取的数据填充这些位置。如上所述,我可以记录差异数组,但当我尝试记录其任何对象(如差异[0])时,会得到一个未定义的值。