javascript - 在 javascript 中使用 Array.sort() 时,以下情况有什么区别?

标签 javascript

CASE 1:

let items = [
  { name: "Edward", value: 21 },
  { name: "Shane", value: 37 },
  { name: "Daniel", value: 45 },
  { name: "Daniel", value: -12 },
  { name: "Magnetic", value: 13 },
  { name: "Magnetic", value: 37 },
];

items.sort(function (a, b) {
  if (a.name<b.name) {
    return -1;
  }
  if (a.name>b.name) {
    return 1;
  }
  // names must be equal
  return 0;
});

console.log(items);

CASE 2:

let items = [
  { name: "Edward", value: 21 },
  { name: "Shane", value: 37 },
  { name: "Daniel", value: 45 },
  { name: "Daniel", value: -12 },
  { name: "Magnetic", value: 13 },
  { name: "Magnetic", value: 37 },
];

items.sort(function (a, b) {
  if (a.name<b.name) {
    return -1;
  }
  if (a.name>b.name) {
    return 1;
  }
  // no case for equal names
});

console.log(items);

CASE 3:

items.sort(function (a, b) {
  return a.name < b.name ? -1 : 1;
});

All three return the following

[
  { name: 'Daniel', value: 45 },
  { name: 'Daniel', value: -12 },
  { name: 'Edward', value: 21 },
  { name: 'Magnetic', value: 13 },
  { name: 'Magnetic', value: 37 },
  { name: 'Shane', value: 37 }
]

上面提到的所有片段都返回相同的结果,但肯定有一些示例所有这些都返回不同的结果(我不知道)。我想知道当没有名称相等的返回条件时会发生什么。

更新: 我在原始问题中添加了案例 3​​,实际上案例 1 和案例 2 的行为相似,因为案例 2 在名称相等时返回 undefined。 但是在我使用三元运算符的情况 3 中,它不会返回 undefined 但答案仍然相同。怎么做?

最佳答案

您的代码的主要问题是您正在比较没有意义的对象。所以你应该对对象中的属性进行排序。看看测试做了什么。

var a = { foo: 1 };
var b = { foo: 2 };

console.log("a > b", a > b);
console.log("a > b", a < b);
console.log("a == b", a == b);

所以在您的排序中,您实际上在每次检查中都有相同的结果。这没有道理。您需要查看对象中的数据。您应该检查 3 个状态 1) SAME、2) Greater 和 3) Less Than。

如果您没有为每个状态返回正确的值,您可能会遇到浏览器每次都对项目进行不同排序的情况。在你的情况下,当它相等时你不会返回任何东西,这将被视为 undefined 并且我们是一个错误的值所以可能应该是 0 这是相等的。当您只返回 1 和 -1 时,您会让浏览器做更多的工作,因为每次进行比较时它都会获得不同的值。这将导致排序顺序不同,并且可能会花费额外的时间,因为它会进行额外的计算。

let items = [
  { name: "Car", value: 100 },
  { name: "Apple", value: 21 },
  { name: "Car", value: 13 },
  { name: "Far", value: 37 },
  { name: "Apple", value: 10 },
  { name: "Bar", value: 45 }
];


items.sort( function (a, b) {

  // if names are equal lets sort on value
  if (a.name === b.name) {
    if (a.value === b.value) {
      return 0;
    } else if (a.value > b.value) {
      return 1;
    } else {
      return -1;
    }
  }
  else if (a.name > b.name) {
    return 1;
  }
  else {
    return -1;
  }
});

console.log(items);

清理代码

let items = [
  { name: "Car", value: 100 },
  { name: "Apple", value: 21 },
  { name: "Car", value: 13 },
  { name: "Far", value: 37 },
  { name: "Apple", value: 10 },
  { name: "Bar", value: 45 }
];

items.sort( function (a, b) {

  // if names are equal lets sort on value
  if (a.name === b.name) {
    if (a.value === b.value) {
      return 0;
    } else {
      return (a.value > b.value) ? 1 : -1;
    }
  } else {
    return a.name.localeCompare(b.name);
  }
});

console.log(items);

关于javascript - 在 javascript 中使用 Array.sort() 时,以下情况有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64173016/

相关文章:

javascript - 有没有办法在 pdf.js 中合并 PDF?

javascript - 为什么 querySelector 只选择第一个元素,我该如何解决这个问题?

javascript - Google App Engine 帮助?

javascript - Ember transitionTo 路由模型钩子(Hook)未调用

javascript - 使用 Canvas 制作动画剪贴蒙版

javascript - 为什么 JSP 中的 lastIndexOf 函数没有给出字符串黑斜杠的精确索引值?

javascript - 使用 javascript 访问最后一个 JSON 元素

javascript - 类型错误:Object(...) 不是函数 - Redux - React-Router

javascript - JS 多个同名函数

javascript - 第一次在 iPad 上点击按钮不起作用