js 归堆操作怎么写?

js中如何将

[
['指南', '设计原则', '一致1'],
['指南', '设计原则', '一致2'],
['指南', '设计原则', '一致3'],
['指南', '导航', '导航1'],
['指南', '导航', '导航2'],
]

快速转换为:

[
"指南>设计原则>一致1|一致2|一致3",
"指南>导航>导航1|导航2",
]
阅读 1.8k
3 个回答
let arr = [
  ["指南", "设计原则", "一致1"],
  ["指南", "设计原则", "一致2"],
  ["指南", "设计原则", "一致3"],
  ["指南", "导航", "导航1"],
  ["指南", "导航", "导航2"],
];
const target = [];
arr.forEach((item) => {
  const [a, b, c] = item;
  const operator1 = ">";
  const operator2 = "|";
  const index = target.findIndex((i) =>
    i.startsWith(a + operator1 + b + operator1)
  );
  if (index === -1) {
    target.push(a + operator1 + b + operator1 + c);
  } else {
    target[index] += operator2 + c;
  }
});

抛砖引玉 target 为目标对象

// 递归合并成对象至最后一级
function merge(arr, result = {}) {
  return arr.reduce((ret, [key, ...args]) => {
    if (args.length > 1) {
      merge([args], (ret[key] = ret[key] || {}));
    } else {
      ret[key] = (ret[key] || []).concat(args[0] || "");
    }
    return ret;
  }, result);
}
// 将对象按照所需格式拼装
function dump(arr) {
  const result = merge(arr, {});
  const print = (obj, path = []) => {
    for (const [key, value] of Object.entries(obj)) {
      const curPath = path.concat(key);
      if (Array.isArray(value)) {
        console.log(curPath.concat("").join(">") + value.join("|"));
      } else {
        print(value, curPath);
      }
    }
  };
  print(result);
}
// 打印结果
console.log(
  dump([
    ["指南", "设计原则", "一致1"],
    ["指南", "设计原则", "一致2"],
    ["指南", "设计原则", "一致3"],
    ["指南", "导航", "导航1"],
    ["指南", "导航", "导航2"],
  ])
);
        let arr = [
            ["指南", "设计原则", "一致1"],
            ["指南", "设计原则", "一致2"],
            ["指南", "设计原则", "一致3"],
            ["指南", "导航", "导航1"],
            ["指南", "导航", "导航2"],
        ];
        let newArr = arr.reduce((a, b) => {
            let index = a.findIndex((item) => {
                let itemArr = item.split(">");
                if (itemArr[0] === b[0] && itemArr[1] === b[1]) {
                    return true;
                }
                return false;
            });
            if (index < 0) {
                a.push(b.join(">"));
            } else {
                a[index] += "|" + b[2];
            }
            return a;
        }, []);
        console.log(newArr);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题