数据对比中的”平等性原则“

2026/3/14 22:01 星期六

我在做数据接入的时遇到了一个情况: 有两个相同的对象:secne, street,他们的形式相同,都是[{...}, {...}],内容也相同,都是{"2025-11-01 10": 10}的形式。

我需要转换成这种形式:

css 复制代码
[  { "x": "1/01", "y": 5, "s": "道路数量" },  { "x": "1/01", "y": 8, "s": "景观数量" },  { "x": "1/01", "y": 13, "s": "总数" },  ...]

我的思路是

  1. 准备一个数组let result = []
  2. 找到大的一方
  3. 遍历大的一方,然后根据大的一方取去取小的一方,取得到就拿,取不到则用0兜底
  4. 计算他们的和
  5. 用push填入result
ini 复制代码
// ❌ 这样做:分出了主次
const secneSize = Object.keys(secne).length;
const streetSize = Object.keys(street).length;
const largeOne = secneSize >= streetSize ? secne : street;

if (secneSize >= streetSize) {
  // 用 secne 的 key 遍历,去 street 里取值
} else {
  // 用 street 的 key 遍历,去 secne 里取值
}

但问题就出在这里: 这样做会明确的区分主次,导致的结果是我需要把这个判断逻辑写两次,难以维护。尽管可以抽成函数的形式来表示,但依旧会把逻辑写的很复杂。

但也可以换个思路: 不区分二者的大小,而是先找到key比较多的对象,遍历它,然后同时去取两个对象的值,同时处理

ini 复制代码
// ✅ 这样做:平等看待
const secneKeys = Object.keys(secne);
const streetKeys = Object.keys(street);
const primaryKeys = 
  secneKeys.length >= streetKeys.length ? secneKeys : streetKeys;

primaryKeys.forEach((key) => {
  const secneVal = secne[key] || 0;    // 同时从两边取
  const streetVal = street[key] || 0;
  // 统一处理
});

这样做有几个好处

  • 不再需要维护if分支
  • 可读性强,不需要在脑子里存储谁遍历谁,从哪里取值,而是找出最大的,同时遍历,取值,结束。非常好读
  • 统一容错,所有的默认值都是0

因此,我认为当遇到整合多方数据时要避免让某一个成为"主体",而是应该让每一个都保持平等的地位------选出一个合理的遍历源(比如 keys 更多的那个),然后从所有数据源里同时取值、同时处理。

ini 复制代码
// 类似的场景:对比两个数组
// ❌ 区分主次
const larger = arr1.length >= arr2.length ? arr1 : arr2;
const smaller = arr1.length >= arr2.length ? arr2 : arr1;

larger.forEach((item, idx) => {
  const val1 = larger[idx];
  const val2 = smaller[idx] || null;
});

// ✅ 平等处理
const maxLen = Math.max(arr1.length, arr2.length);
for (let i = 0; i < maxLen; i++) {
  const val1 = arr1[i] || null;
  const val2 = arr2[i] || null;
  // 同时处理
}
相关推荐
小羊没烦恼!34 分钟前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
码上成长1 小时前
Mapbox 围栏编辑踩过的几个坑:key 串了、形状炸了、icon 挡住绿点
前端·前端框架
SGAMERrain1 小时前
做了一个免费的在线绘画网格工具 DrawGrid,聊聊一个小工具是怎么越做越完整的
前端
我家猫叫佩奇1 小时前
🦭 厌倦了千篇一律的线性图标?Naive Icons 正式开源
前端·javascript·css
LEE2 小时前
前端转型全栈 00:AI 时代该学哪些,不该学哪些
前端·后端
晚安日记wanna2 小时前
SSR 为什么不适合登录态从水合冲突到缓存串号
前端·react.js·面试
aixingpan2 小时前
aixingpan.cn API开发文档:api_docs_bichart_natalvssolararc2接口指南
前端·php
无限压榨切图仔2 小时前
一个优惠券需求改了三端,我才明白全栈不是多学一门语言
前端·后端
晚安日记wanna2 小时前
批量请求失败只弹一个 Toast面试官想听五层
前端·面试·架构
晚安日记wanna2 小时前
TS const 类型参数一道面试题的四层追问
前端·面试·typescript