数组升维
有一组包含type字段的数据,要根据相同type进行归类,比如以type为key数组为value存入map
const arr = [
{
type: '衣服',
name: 'ur',
},
{
type: '衣服',
name: 'zara',
},
{
type: '衣服',
name: 'gucci',
},
{
type: '鞋子',
name: 'aj',
},
{
type: '鞋子',
name: 'nike',
},
];
/**
* @description 使用对象key唯一性存储每个type
* */
function merge(data) {
const map = {};
for (const item of data) {
(map[item.type] || (map[item.type] = [])).push(item);
}
return Object.values(map); // 返回所有value的集合
}
console.log(merge(arr));
控制台输出:
数组降维
有一个多维数组,要将里面的元素都拿出来放入一个一维数组里
// 栈实现
function flat(arr) {
const result = []
const stack = [...arr]
while (stack.length > 0) {
// 从栈中取出一个元素 如果是数组则将元素压栈
const element = stack.pop()
if (Array.isArray(element)) {
stack.push(...element)
continue
}
// 不是数组则存起来
result.push(element)
}
return result
}
console.log(
flat([
[1, 2],
[
[3, 4],
[5, [6, 7]],
],
[8, 9, 10],
])
)
// 队列实现 因为是先进先出同栈的拍平顺序相反
function flat2(arr) {
const result = []
const queue = [...arr]
while (queue.length > 0) {
const element = queue.shift()
if (Array.isArray(element)) {
queue.push(...element)
continue
}
result.push(element)
}
return result
}
console.log(
flat2([
[1, 2],
[
[3, 4],
[5, [6, 7]],
],
[8, 9, 10],
])
)
// 递归实现
function flat3(arr) {
return arr.reduce((result, curr) => {
// 是数组就递归查找子集并将返回结果concat
if (Array.isArray(curr)) {
result = result.concat(flat3(curr))
} else {
// 不是数组则直接存储
result.push(curr)
}
return result
}, [])
}
console.log(
flat3([
[1, 2],
[
[3, 4],
[5, [6, 7]],
],
[8, 9, 10],
])
)
控制台输出: