出自面试官给我的一道题:
已知数组[‘a’,‘ab’,‘abc’,‘ab’,…],把数组按照字符串出现次数由大到小进行排序,建议通过编码实现
我写了两种输出结果:
由大到小排序,且去重
const arr = ['a', 'ab', 'abc', 'ab', 'a', 'abc', 'bc', 'ab']
const mapArr = new Map() //创建一个Map结构数据
arr.map(item => { //遍历数组
if (mapArr.has(item)) { //如果Map数据中存在当前项,给当前项值(即个数)+1
let current = mapArr.get(item)
mapArr.set(item, current += 1)
} else { //如果不存在,则添加该项并将它的个数设置为1
mapArr.set(item, 1)
}
})
//将map结构数据转换成数组对象,每一项也是数组的形式包裹的key和value
const mapEntries = [...mapArr.entries()]
// mapEntries [ [ 'a', 2 ], [ 'ab', 3 ], [ 'abc', 2 ], [ 'bc', 1 ] ]
mapEntries.sort((pre, nxt) => {
return pre[1] < nxt[1] ? 1 : -1
}) //给mapEntries 排序
const target = mapEntries.map(item => item[0])
console.log('target', target) //target [ 'ab', 'abc', 'a', 'bc' ]
由大到小排序,不去重
const arr = ['a', 'ab', 'abc', 'ab', 'a', 'abc', 'bc', 'ab']
const mapArr = new Map()
arr.map(item => {
if (mapArr.has(item)) { //和上面的区别是,将Map结构的数据它的value值直接设置为遍历的每一项
let current = mapArr.get(item).concat([item])
mapArr.set(item, current)
} else {
mapArr.set(item, [item])
}
})
//mapArr是这样的数据:Map(4) {
// 'a' => [ 'a', 'a' ],
// 'ab' => [ 'ab', 'ab', 'ab' ],
// 'abc' => [ 'abc', 'abc' ],
// 'bc' => [ 'bc' ]
//}
//然后再转成二维数组排序,再遍历降维
const mapEntries = [...mapArr.entries()]
mapEntries.sort((pre, nxt) => {
return pre[1].length < nxt[1].length ? 1 : -1
})
const target = mapEntries.map(item => item[1]).flat()
console.log('target', target)
// target ['ab','ab','ab','abc','abc','a','a','bc']
遍历数组每项,计算相同项的个数
const arr = ['a', 'ab', 'abc', 'ab', 'a', 'abc', 'bc', 'ab']
const temp = arr.reduce((pre, nxt) => {
if (nxt in pre) {
pre[nxt]++
} else {
pre[nxt] = 1
}
return pre
}, {})
console.log(temp) //{ a: 2, ab: 3, abc: 2, bc: 1 }