js 数组拆分以及拼接

新手上路,请多包涵

['140200', '140300', '140400', '220300', '220400']
这样一个数组,有什么办法可以让14开头的拼接在一起,22开头的拼接在一起,可能还有其他很多6位数,怎么让6位数的前两个相同的拼接在一起,最后是这样
['140200,140300,140400', '220300,220400']

阅读 5k
6 个回答
function splice(arr) {
    var ret = [];
    loop: for (var i = 0; i < arr.length; ++i) {
        for (var j = 0; j < ret.length; ++j) {
            if (ret[j].slice(0, 2) === arr[i].slice(0, 2)) {
                ret[j] += "," + arr[i];
                continue loop;
            }
        }
        ret.push(arr[i]);
    }
    return ret;
}
console.dir(splice(["140200", "140300", "140400", "220300", "220400"]));

image.png

var arr = ['140200', '140300', '140400', '220300', '220400'];
var arrGroup = arr.reduce((acc,cur)=>{
    //(acc[cur.slice(0,2)]||=[]).push(cur);
    if(!acc[cur.slice(0,2)]) acc[cur.slice(0,2)] =[];
    acc[cur.slice(0,2)].push(cur);
    return acc;
},{})
console.log(arrGroup)
Object.values(arrGroup).map(item=> item.toString());
// ['140200,140300,140400', '220300,220400']

直接按数字大小排个序就行了吧

既然都是 6 位数字组成的字符串,直接排序就是需要的结果(Array.prototype.sort() 本身就是按字符序排)

data.sort();

如果要按原来出现的顺序:(注意下例示例代码中 data 改了数据顺序的)

const data = ["140200", "220300", "140400", "140300", "220400"];

const r = data
    .reduce(
        (result, s) => {
            const key = s.substring(0, 2);
            const arr = result.find(([it]) => it.startsWith(key));
            if (arr) {
                arr.push(s);
            } else {
                result.push([s]);
            }
            return result;
        },
        []
    )
    .flat();

console.log(r);
// [ '140200', '140400', '140300', '220300', '220400' ]

新建一个Map
key就是arr[i]的前两位
对arr进行遍历,对相同的key,其值就是arr[i]的数组

然后对map进行遍历就行
复杂度是2n

大佬都在玩手写的吗?我上个lodash的玩法吧。

const temp1 = _.groupBy( ['140200', '140300', '140400', '220300', '220400'], (str)=>str.slice(0,2));

Object.values(_.mapValues(temp1,item=>item.join()))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题