第 30 题:请把俩个数组 [A1, A2, B1, B2, C1, C2, D1, D2] 和 [A, B, C, D],合并为 [A1, A2, A, B1, B2, B, C1, C2, C, D1, D2, D]
function concatArr (arr1, arr2) { const arr = [...arr1]; let currIndex = 0; for (let i = 0; i < arr2.length; i++) { const RE = new RegExp(arr2[i]) while(currIndex < arr.length) { ++currIndex if (!RE.test(arr[currIndex])) { arr.splice(currIndex, 0, a2[i]) break; } } } return arr } var a1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] var a2 = ['A', 'B', 'C', 'D'] const arr = concatArr(a1, a2) console.log(a1) // ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] console.log(a2) // ['A', 'B', 'C', 'D'] console.log(arr) // ['A1', 'A2', 'A', B1', 'B2', 'B', C1', 'C2', 'C', D1', 'D2', 'D']
以上是我个人想法,有更好方法的欢迎讨论
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(53)
题目测试用例有点少规则太模糊了。。
写一个用sort的吧
想法是将合并后的数组sort完,将如A、B替换到A1等的后面。这样的好处是只需要一次遍历。缺点是仅仅针对题目的数据格式,即A1 和 A的字符串长度。
其实一开始想到的是下面这种替换合并后的数组。不过感觉不如新起一个数组
//利用字符串的charCodeAt 进行排序,some 只要找到一个符合条件的就不要在进行循环了
var array = ['A1', 'A2','B1', 'B2', 'C1', 'C2', 'D1', 'D2']
var array1 = ['A','B','C','D']
var result = array//重新定义一个新的数组,不影响原来的数组
var array2 = array.join('').split('')
array1.some((x,index)=>{
array2.some((y,key)=>{
if(y.charCodeAt()>x.charCodeAt()){
return result.splice((key/2)+index,0,x)
}
})
})
result.push(array1[array1.length-1])
`
var arr1 = ["A1", "A2", "B1", "B2", "C1", "C2", "D1", "D2"]
var arr2 = ["A", "B", "C", "D"]
let count = 2
arr2.forEach((item, index) => {
arr1.splice(index * 2 + count, 0, item)
count++
})
console.log(arr1)
`
以上是我觉得相对简单的,可以看出arr1相应的规律是2的平方阶,然后每次插入新元素都会加1,所以用count++来处理
const a1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'];
const a2 = ['A', 'B', 'C', 'D'].map(item=>{ return item + '3'; });
const a3 = [...a1,...a2].sort().map(item=>{ return item.split('3')[0] });
console.log(a3,'a3'); // ["A1", "A2", "A", "B1", "B2", "B", "C1", "C2", "C", "D1", "D2", "D"] "a3"
合并排序就完事了啊;考察的什么呢?
function concatArr(a1, a2) {
var reg = /[^0-9]/ig;
return [...a1, ...a2].sort((a, b) => {
var num1 = a.replace(reg, ' ').trim().split(' ')[0];
var num2 = b.replace(reg, ' ').trim().split(' ')[0];
var ascoll1 = a.charCodeAt();
var ascoll2 = b.charCodeAt();
if (!num1 || !num2) {
if (ascoll1 !== ascoll2) return ascoll1 - ascoll2;
if (!num1) return 1
return -1
}
return (ascoll1 + num1) - (ascoll1 + num2)
})
}
let arrA = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'];
let arrB = ['A', 'B', 'C', 'D'];
使用了双指针:
['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'].reduce((a,c,i,r)=>(a.push(c),(r.map(z=>z.charAt(0)).lastIndexOf(c.charAt(0))===i)&&a.push(c.charAt(0)),a),[])
更简单的一种写法,希望对你有所帮助
let arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'];
let arr2 = ['A', 'B', 'C', 'D'];
let arr3 = [];
let obj = {};
arr2.forEach((item) => {
obj[item] = [];
});
arr1.forEach((item) => {
arr2.forEach((it) => {
if (item.indexOf(it) !== -1) {
obj[it].push(item);
}
});
});
Object.keys(obj).forEach((key) => {
arr3.push(obj[key]);
arr3.push(key);
});
console.log(arr3.flat(Infinity));
我想请教下,为啥test加了g全局后,A2匹配不到
想到做的一个需求,插入广告位,在1、3、6插入广告数据,跟这个应该是一个道理
function fn (arr1, arr2) {
let arr = arr1.concat(arr2)
arr = arr.sort((a, b) => {
let a1 = a.split('')
let b1 = b.split('')
let flag = a1[0] > b1[0]
if (flag) {
return flag
} else {
return (a[1] ? a[1] : 0) - (b[1] ? b[1] : 0)
}
})
return arr
}
let arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']
let arr2 = ['A', 'B', 'C', 'D']
fn(arr1, arr2)
let a1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']
let a2 = ['A', 'B', 'C', 'D']
let a3 = a2.reduce((pre, item, index)=>{
return [...pre, a1[2 * index], a1[2 * index + 1], item]
}, [])
console.log(a3)
实测通过,写的很墨迹 ,但是简单易懂
`var arr = ['A3', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']
var arr2 = ['A', 'B', 'C', 'D','A1']
const sort = (arr,arr2)=> {
let arr3 = []
//做一个空数组
arr.forEach((ele,index) => {
arr3.push(ele.substring(1) !== ' '?{
value1:ele.charAt(0),
value2:ele.substring(1)
}:{
value1:ele.charAt(0),
value2:Number.MAX_SAFE_INTEGER
})
});
arr2.forEach((ele,index) => {
arr3.push(ele.substring(1) !== ''?{
value1:ele.charAt(0),
value2:ele.substring(1)
}:{
value1:ele.charAt(0),
value2:Number.MAX_SAFE_INTEGER
})
});
arr3.sort(function (a, b) {
return (a.value2 - b.value2)
});
arr3.sort(function (a, b) {
let A = a.value1
let B = b.value1
if (A < B) {
return -1;
}
if (A > B) {
return 1;
}
// must be equal
return 0;
});
let arr4 = []
arr3.forEach((ele,idx)=>{
if(ele.value2 == Number.MAX_SAFE_INTEGER){
ele.value2 =' '
}
ele.value1= ele.value1 + ele.value2 + ' '
arr4.push(ele.value1)
})
return arr4
}
console.log(sort(arr,arr2))`
思路
可能要注意的点
@liuliangsir 解法是对的,就是你这个函数能不能换行啊,这样长看着多不舒服
const arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']
const arr2 = ['A', 'B', 'C', 'D']
const res = [].concat(...arr2.map(i => arr1.filter(j => j.startsWith(i)).concat(i)))
console.log(res)
借鉴了前面各位大神的。
提一个新思路的版本,从修改sort入手,不依赖数组下标,通用性更强
其实解法很简单的
如果只是单纯解这道题的话,我这样做:
这样即使是
["A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "D1", "D2"]
等等也没问题啦假设有一种情况,让你在一个列表中插入一个广告,不光是数组,对象依然有这种需求,这道题其实就是平常经常需要用到的一个小功能。
我想问下,这题想考的是哪方面的知识?
var arrOne =["A1", "A2", "B1", "B2", "C1", "C2", "D1", "D2"];
var arrTwo = ['A', 'B', 'C', 'D'];
for (let i = 0; i < arrTwo.length; i++) {
let re = new RegExp(arrTwo[i], 'g');
for (let x = arrOne.length; x > 0; x--) {
if(re.test(arrOne[x])){
arrOne.splice(x+1,0,arrTwo[i])
}
}
}
console.log(arrOne);
这样是否可以呢?
看一下我这个可以嘛
——————————————————————
截图
var arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'];
var arr2 = ['A', 'B','C', 'D'];
function fn (arr1, arr2) {
let arr3 = [...arr1];
let index = -1;
arr2.forEach((v, i) => {
index = index + 3;
arr3.splice(index, 0, v);
});
return arr3;
}
console.log(fn(arr1, arr2)); // [ 'A1', 'A2', 'A', 'B1', 'B2', 'B', 'C1', 'C2', 'C', 'D1', 'D2', 'D' ]
// -1 + 3 = 2
// 2 + 3 = 5
// 5 + 3 = 8
// 8 + 3 = 11
// 首先想到了用concat+sort,但结果不对。后来想观察了一下,用splice插入,因为插入位置是固定的。
利用mdn对sort映射改善排序的方法进行的处理,不过对数组进行了多次处理,感觉方法不太好