当前位置: 首页 > 知识库问答 >
问题:

javascript - 判断两个树形数组是否相同(list1旧数组,list2新数组), 不同返回 不同的属性 属性值 求大佬指点 返回true或false也可以 顺序可以打乱?

方英耀
2023-06-18
var list1 = {
  transactionYear: 0,
  transactionMonth: 0,
  transactionDay: 1,
  groupId: "428CB095-A67C-4A88-9CD1-E472E496446E",
  // 数组
  accessoryList: [
    {
      id: "CF0D7DEF-5702-4CBD-B8AF-51F499586A28",
      createTime: "2023-06-16 11:05:41",
    },
  ],
  // 数组
  relationList: [
    {
      id: "29406050-AE9D-40EA-9EDA-F8084D2F798A",
      createTime: "2023-06-16 11:05:41",
    },
  ],
  // 数组
  employeeList: [
    {
      reportEmployee: false,
      employeePerformance: 101.0,
    },
  ],
}

var list2 = {
  transactionYear: 0,
  transactionMonth: 0,
  transactionDay: 1,
  groupId: "428CB095-A67C-4A88-9CD1-E472E496446E",
  // 数组
  accessoryList: [
    {
      id: "CF0D7DEF-5702-4CBD-B8AF-51F499586A28",
      createTime: "2023-06-16 11:05:41",
    },
  ],
  // 数组
  relationList: [
    {
      id: "29406050-AE9D-40EA-9EDA-F8084D2F798A",
      createTime: "2023-06-16 11:05:41",
    },
  ],
  // 数组
  employeeList: [
    {
      reportEmployee: false,
      employeePerformance: 101.0,
    },
  ],
}

共有2个答案

唐彬炳
2023-06-18
function isSame(a,b) {
  const type = v => ({}).toString.call(v);
  // 是否传入相同对象
  if(a === b) return true;
  // 是否类型一致
  if(type(a) !== type(b)) return false;
  // 空值判断
  // 因为类型判断在前,故而空值直接返回true
  if(a === null || a === void 0) return true;
  // 数组优先判断长度,长度一致再遍历对比
  if(Array.isArray(a)) return a.length === b.length && a.every((v,i) => isSame(v, b[i]));
  // 对象同数组,优先判断key数量
  if(typeof a == 'object') return Object.keys(a).length == Object.keys(b).length && Object.entries(a).every(([k,v]) => isSame(v, b[k]))
  // 最后判断值是否相等
  return a === b;
}
拓拔欣嘉
2023-06-18
function isEqual(a, b) {
    if (Object.is(a, b)) return true;
    if (
        typeof a !== "object" ||
        a === null ||
        typeof b !== "object" ||
        b === null
    ) {
        return false;
    }
    const keysA = Object.keys(a);
    const keysB = Object.keys(b);
    if (keysA.length !== keysB.length) return false;
    for (let i = 0; i < keysA.length; ++i) {
        if (
            !Object.hasOwn(b, keysA[i]) ||
            !isEqual(a[keysA[i]], b[keysB[i]])
        ) {
            return false;
        }
    }
    return true;
}
console.log(isEqual(list1, list2));
 类似资料:
  • 我正在从第三方网站(家庭用电)检索JSON,根据我从网站请求的内容,返回的JSON可能是也可能不是数组。例如,如果我请求我的智能电表列表,我会得到这个(由于尺寸大,结果被截断): 其中 gwrcmd 是单个元素。 但是如果我要求过去半个小时的用电,我会得到这个: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个类似这样的结构(再次,被截断,因为它持续了一段时间。“版本”下有更

  • 在这两行中都输出。它们是相同的东西,所以输出的不应该是吗?

  • 从一个对象的自身(是否继承可选)可枚举属性返回一个函数属性名称数组。 使用 Object.keys(obj) 来迭代对象的自身属性。 如果 inherited 是 true ,则使用 Object.get.PrototypeOf(obj) 来获得对象的继承属性。 使用 Array.filter() 只保留那些函数的属性。 省略第二个参数 inherited,默认情况下不包含继承的属性。 const

  • 我有一个任务,检查两个html标签是否具有相同的含义。就像下面的两个:虽然属性本身以不同的顺序出现,但它们被表示为相同的含义,因此它们应该被归类为相同的。 另一个棘手的事情是注意下的属性处于相同的情况:不同的顺序但相同的含义。 我能想到的方法是为每个人将它们的每个属性推送到一个数组中并对其进行排序,并检查数组是否相同,但我如何处理那些“嵌套”的属性。我只是想不出一个可行的解决方案。 我该怎么做?有

  • 问题内容: 我有以下收藏 我要收集所有其 在主阵列 我已经试过了 但这给了我这样的输出 我想要这样的输出 问题答案: 你可以。与mongoose一起使用,因为它返回一个数组,与使用相比,简单使用更好 或使用核心驱动程序中的基础: 如果您不希望获得“与众不同”的结果,则与之大致相同: 或与 您还可以使用,基本上可以改变聚合过程和“幕后”(“仅返回字段部分”,而不是独特的聚合方法): MongoDB本

  • 问题内容: 我试图从我的int数组返回两个最大的整数。我能够返回最大和最小的罚款,但无法获得返回两个最大罚款的算法。任何帮助在这里都将不胜感激。 请原谅我的代码中的任何错误。这是一次练习,问题取自去年大学的考试材料。 这是我的代码: 问题答案: 你可以写