js数组排列组合算法 (前端面试三维数组如何遍历)

假设有一个 JavaScript 数组,每个元素都是一个对象,包含了三层分类的数据。我们需要将这个数组中的数据按照三层分类合并成一个新的数组。

举个例子,假设原数组如下:

const dataArray = [
  { category1: 'fruit', category2: 'apple', category3: 'red', name: 'red apple', price: 1.5 },
  { category1: 'fruit', category2: 'apple', category3: 'green', name: 'green apple', price: 1.8 },
  { category1: 'fruit', category2: 'banana', category3: 'yellow', name: 'yellow banana', price: 2.0 },
  { category1: 'vegetable', category2: 'carrot', category3: 'orange', name: 'orange carrot', price: 0.5 },
  { category1: 'vegetable', category2: 'potato', category3: 'white', name: 'white potato', price: 0.8 },
  { category1: 'meat', category2: 'chicken', category3: 'breast', name: 'chicken breast', price: 4.0 },
  { category1: 'meat', category2: 'chicken', category3: 'leg', name: 'chicken leg', price: 3.5 },
  { category1: 'meat', category2: 'beef', category3: 'sirloin', name: 'beef sirloin', price: 6.0 }
];

我们需要将这个数组按照 category1、category2、category3 属性进行分类合并,得到如下新数组:

[
  {
    category: 'fruit',
    subcategories: [
      {
        category: 'apple',
        subcategories: [
          { category: 'red', items: [{ name: 'red apple', price: 1.5 }] },
          { category: 'green', items: [{ name: 'green apple', price: 1.8 }] }
        ]
      },
      {
        category: 'banana',
        subcategories: [
          { category: 'yellow', items: [{ name: 'yellow banana', price: 2.0 }] }
        ]
      }
    ]
  },
  {
    category: 'vegetable',
    subcategories: [
      {
        category: 'carrot',
        subcategories: [
          { category: 'orange', items: [{ name: 'orange carrot', price: 0.5 }] }
        ]
      },
      {
        category: 'potato',
        subcategories: [
          { category: 'white', items: [{ name: 'white potato', price: 0.8 }] }
        ]
      }
    ]
  },
  {
    category: 'meat',
    subcategories: [
      {
        category: 'chicken',
        subcategories: [
          { category: 'breast', items: [{ name: 'chicken breast', price: 4.0 }] },
          { category: 'leg', items: [{ name: 'chicken leg', price: 3.5 }] }
        ]
      },
      {
        category: 'beef',
        subcategories: [
          { category: 'sirloin', items: [{ name: 'beef sirloin', price: 6.0 }] }
        ]
      }
    ]
  }
]

下面是实现代码:

const mergedArray = dataArray.reduce((acc, cur) => {
  const existingCategory1 = acc.find(item => item.category === cur.category1);
  if (existingCategory1) {
    const existingCategory2 = existingCategory1.subcategories.find(item => item.category === cur.category2);
    if (existingCategory2) {
      const existingCategory3 = existingCategory2.subcategories.find(item => item.category === cur.category3);
      if (existingCategory3) {
        existingCategory3.items.push({ name: cur.name, price: cur.price });
      } else {
        existingCategory2.subcategories.push({
          category: cur.category3,
          items: [{ name: cur.name, price: cur.price }]
        });
      }
    } else {
      existingCategory1.subcategories.push({
        category: cur.category2,
        subcategories: [{
          category: cur.category3,
          items: [{ name: cur.name, price: cur.price }]
        }]
      });
    }
  } else {
    acc.push({
      category: cur.category1,
      subcategories: [{
        category: cur.category2,
        subcategories: [{
          category: cur.category3,
          items: [{ name: cur.name, price: cur.price }]
        }]
      }]
    });
  }
  return acc;
}, []);

前端面试题遍历数组的方法,js数组排列组合算法

与之前的实现类似,这里使用 reduce() 方法对原数组进行遍历,累加器 acc 初始值为空数组。对于每个元素 cur,首先判断其 category1 属性是否已存在于 acc 中,如果存在,则继续往下查找 category2 和 category3 属性;否则,创建一个新的对象,并添加到 acc 中。在查找过程中,每一层的处理逻辑类似,如果已存在对应的分类,则将该元素添加到 items 数组中;否则,创建一个新的对象,并添加到对应的 subcategories 数组中。最后返回累加器 acc。

#挑战30天在头条写日记#