如何高效生成对象数组中相同属性名的所有左向索引组合
发布时间 - 2026-01-21 00:00:00 点击率:次本文介绍一种简洁高效的 javascript 方法,用于从对象数组中提取具有相同属性名的元素索引,并生

在处理结构松散的对象数组(每个对象仅含一个键值对)时,常需分析“哪些位置共享同一属性名”,并进一步获取这些位置之间所有合法的有序索引对(即 i 前端数据比对、可视化连线逻辑或测试用例生成等场景。
核心思路分为两步:
- 按属性名聚类索引:遍历数组,对每个对象提取其唯一键(Object.keys(obj)[0]),记录该键首次及后续出现的所有下标;
- 生成组合对:对每个属性名对应的索引数组(如 [0, 1, 2]),生成所有满足 i 排列。
以下是完整可运行的实现:
function groupIndicesByProperty(arr) {
const groups = {};
arr.forEach((obj, i) => {
const key = Object.keys(obj)[0];
if (!groups[key]) groups[key] = [];
groups[key].push(i);
});
return groups;
}
const pairsOf = (values) =>
values.flatMap((a, i) => values.slice(i + 1).map(b => [a, b]));
const getLeftToRightIndexPairs = (arr) =>
Object.fromEntries(
Object.entries(groupIndicesByProperty(arr))
.map(([key, indices]) => [key, pairsOf(indices)])
.filter(([, pairs]) => pairs.length > 0)
);
// 使用示例
console.log(
getLeftToRightIndexPairs([
{ property1: 10 },
{ property1: 13 },
{ property1: 15 },
{ property2: 2 }
])
);
// → { property1: [[0,1], [0,2], [1,2]] }
console.log(
getLeftToRightIndexPairs([
{ property1: 10 },
{ property1: 13 },
{ property2: 15 },
{ property2: 2 }
])
);
// → { property1: [[0,1]], property2: [[2,3]] }
console.log(
getLeftToRightIndexPairs([
{ property1: 10 },
{ property1: 13 },
{ property1: 15 },
{ property1: 2 }
])
);
// → { property1: [[0,1], [0,2], [0,3], [1,2], [1,3], [2,3]] }✅ 关键说明:
- groupIndicesByProperty 使用 Object.keys(obj)[0] 安全提取单属性键(假设输入严格满足“每对象仅一个键”);
- pairsOf 利用 flatMap + slice(i+1) 实现 O(n²) 组合生成,天然保证 i
- 最终结果自动剔除无配对的属性(如某属性仅出现一次),保持输出精简;
- 时间复杂度为 O(n + m·k²),其中 n 是数组长度,m 是不同属性数,k 是某属性最大出现频次(题设中 k ≤ 4,性能无忧)。
该方案简洁、可读性强,且完全契合“仅左向组合”的业务约束,可直接集成至工具函数库中复用。
# javascript
# java
# 前端
# 工具
# ai
# 键值对
# 排列
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Android 常见的图片加载框架详细介绍
如何确认建站备案号应放置的具体位置?
如何快速搭建个人网站并优化SEO?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何在Ubuntu系统下快速搭建WordPress个人网站?
jquery插件bootstrapValidator表单验证详解
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
详解vue.js组件化开发实践
网站建设整体流程解析,建站其实很容易!
如何选择可靠的免备案建站服务器?
Laravel怎么为数据库表字段添加索引以优化查询
Angular 表单中正确绑定输入值以确保提交与验证正常工作
焦点电影公司作品,电影焦点结局是什么?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何在IIS管理器中快速创建并配置网站?
如何在建站之星绑定自定义域名?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何使用Eloquent进行子查询
零服务器AI建站解决方案:快速部署与云端平台低成本实践
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何快速搭建支持数据库操作的智能建站平台?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
网站制作壁纸教程视频,电脑壁纸网站?
Python高阶函数应用_函数作为参数说明【指导】
Laravel如何自定义错误页面(404, 500)?(代码示例)
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何在阿里云完成域名注册与建站?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
装修招标网站设计制作流程,装修招标流程?
微信小程序 闭包写法详细介绍
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何制作一个表白网站视频,关于勇敢表白的小标题?
Java垃圾回收器的方法和原理总结
微信小程序 require机制详解及实例代码
如何用JavaScript实现文本编辑器_光标和选区怎么处理
EditPlus中的正则表达式 实战(1)
怎么用AI帮你设计一套个性化的手机App图标?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
网易LOFTER官网链接 老福特网页版登录地址
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
教你用AI润色文章,让你的文字表达更专业
如何快速搭建FTP站点实现文件共享?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Android使用GridView实现日历的简单功能
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知

