JS 按照数组顺序对对象进行排序

在JavaScript中,可以通过将对象转换为可排序的结构(如数组),使用自定义比较函数基于参考数组的顺序进行排序,然后转换回对象来实现。以下是一个通用的函数示例,它接受一个参考数组和一个待排序的对象,并返回一个新对象,其键按照参考数组的顺序排列。

**需求:**自定义排序 el-table 表格的列。
思路:根据数组字段的顺序,对对象中的key值进行重新排序。
复制代码
// 示例代码

const referenceOrder = ['sunday', 'monday', 'wednesday', 'thursday', 'friday'];
const unsortedObject = {
  wednesday: 'wednesday',
  friday: 'friday',
  monday: 'monday',
  thursday: 'thursday',
  sunday: 'sunday'
};



// 预期输出:
const unsortedObject = {
  sunday: 'sunday',
  monday: 'monday',
  wednesday: 'wednesday',
  thursday: 'thursday',
  friday: 'friday'
};
代码实现:
复制代码
/**
 * 按照数组顺序对对象进行排序
 * @param {Array} arr - 排序依据的数组
 * @param {Object} obj - 需要排序的对象
 * @returns {Object} 按数组顺序重新排列的对象
 */

export function sortObjectByArray(arr, obj) {
  const sortedObj = {};
  arr.forEach(key => {
    if (obj.hasOwnProperty(key)) {
      sortedObj[key] = obj[key];
    }
  });
  return sortedObj;
}


 let sortedObject = sortObjectByArray(arr, object);
 console.log(sortedObject);
 // 输出结果: {
    sunday: 'sunday',
    monday: 'monday',
    wednesday: 'wednesday',
    thursday: 'thursday',
    friday: 'friday'
  };
问题:

在Vue中发现 调用 hasOwnProperty 报错:不要使用对象原型上的方法,因为原型的方法可能会被重写。

Do not access Object.prototype method 'hasOwnProperty' from target object no-prototype-builtins

原因:

出现这种报错是因为使用Vue.js启动项目会自动生成配置为与ESLint一起使用的样板

ESLint是一个能帮助识别报告JS中的不良模式,以便维护代码

在ECMAScript5.1中,新增了 Object.create,它支持使用指定的 [[Prototype]] 创建对象。Object.create(null)是一种常见的模式,用于创建将用作映射的对象

Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString(), hasOwnProperty()等方法

因为 no-prototype-builtins 规则不允许Object.prototype直接从对象调用方法,所以会导致这种错误

解决方法:

将xxx.hasOwnProperty('yyy')修改为Object.prototype.hasOwnProperty.call(xxx, 'yyy')

复制代码
/**
 * 按照数组顺序对对象进行排序
 * @param {Array} arr - 排序依据的数组
 * @param {Object} obj - 需要排序的对象
 * @returns {Object} 按数组顺序重新排列的对象
 */

export function sortObjectByArray(arr, obj) {
  const sortedObj = {};
  arr.forEach(key => {
    // if (obj.hasOwnProperty(key)) {  // 修改前
    if (hasOwnKey(obj, key)) {  // 修改后
      sortedObj[key] = obj[key];
    }
  });
  return sortedObj;
}


function hasOwnKey(obj, key) {
  return Object.prototype.hasOwnProperty.call(obj, key)
}

记录一下~

相关推荐
清山博客1 小时前
OpenCV 人脸识别和比对工具
前端·webpack·node.js
要加油哦~1 小时前
AI | 实践教程 - ScreenCoder | 多agents前端代码生成
前端·javascript·人工智能
玄同7651 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
程序员Sunday1 小时前
说点不一样的。GPT-5.3 与 Claude Opus 4.6 同时炸场,前端变天了?
前端·gpt·状态模式
czy87874751 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-19431 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq1982043011561 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class1 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
Jinkxs1 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&1 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin