如何高效生成对象数组中相同属性名的所有左向索引组合

发布时间 - 2026-01-21 00:00:00    点击率:

本文介绍一种简洁高效的 javascript 方法,用于从对象数组中提取具有相同属性名的元素索引,并生

成所有满足“左到右”顺序的两两索引对(如 [0,1]、[0,2]、[1,2]),最终按属性名分组返回。

在处理结构松散的对象数组(每个对象仅含一个键值对)时,常需分析“哪些位置共享同一属性名”,并进一步获取这些位置之间所有合法的有序索引对(即 i 前端数据比对、可视化连线逻辑或测试用例生成等场景。

核心思路分为两步:

  1. 按属性名聚类索引:遍历数组,对每个对象提取其唯一键(Object.keys(obj)[0]),记录该键首次及后续出现的所有下标;
  2. 生成组合对:对每个属性名对应的索引数组(如 [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实现多渠道消息通知