Skip to content

给定数组 已知 js 数组 [{property: 'section'}, {property: 'index'}, {property: 'id'}],请你写一个方法根据 ['index', 'id', 'selection] 来排序

您可以通过使用 JavaScript 的 sort() 方法来解决这个问题。以下是一个示例,我们定义了一个自定义的排序函数,根据给定的属性顺序数组来对对象数组进行排序:

javascript
function sortArrayByProperties(objArray, propertiesArray) {
  return objArray.sort((a, b) => {
    for (let i = 0; i < propertiesArray.length; i++) {
      if (a.property === propertiesArray[i]) {
        return -1;
      } else if (b.property === propertiesArray[i]) {
        return 1;
      }
    }
    return 0;
  });
}

let arr = [{ property: "section" }, { property: "index" }, { property: "id" }];
let order = ["index", "id", "section"];

let sortedArr = sortArrayByProperties(arr, order);

console.log(sortedArr); // 输出: [{property: 'index'}, {property: 'id'}, {property: 'section'}]

这个函数通过比较两个对象的 property 属性是否在属性顺序数组中的位置来确定它们的顺序。如果一个对象的 property 属性在属性顺序数组中的位置更前,那么这个对象就在排序后的数组中的位置会更前。

注意:这个函数只会工作如果你确保所有的属性都在 propertiesArray 中,并且 propertiesArray 不包含任何额外的属性。否则,你可能需要添加一些额外的逻辑来处理这些情况。

这种排序的方式是最优解吗

以上的排序方式在大多数情况下都可以工作,但它可能不是最优的解决方案,因为它依赖于 JavaScript 的sort方法,该方法的时间复杂度在最坏的情况下可以达到 O(n^2)。并且这种方式还需要遍历属性数组来确定排序顺序,增加了额外的复杂性。

更优的解决方案是先创建一个映射,将属性和它们在排序数组中的位置关联起来,然后使用这个映射来排序对象数组。这样可以将时间复杂度降低到 O(n log n):

javascript
function sortArrayByProperties(objArray, propertiesArray) {
  let sortOrder = {};
  for (let i = 0; i < propertiesArray.length; i++) {
    sortOrder[propertiesArray[i]] = i;
  }

  return objArray.sort((a, b) => {
    return sortOrder[a.property] - sortOrder[b.property];
  });
}

let arr = [{ property: "section" }, { property: "index" }, { property: "id" }];
let order = ["index", "id", "section"];

let sortedArr = sortArrayByProperties(arr, order);

console.log(sortedArr); // 输出: [{property: 'index'}, {property: 'id'}, {property: 'section'}]

这种方式的优点是不需要在排序函数中遍历属性数组,因此运行时间更短,更有效率。注意,这种方法依赖于propertiesArray中的所有元素都是唯一的,否则映射将无法正确工作。