版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duola8789/article/details/84549754
失望
题目(2018-11-26)
现在有一个数组存放字符串数据:
const items = ['item1', 'item2', 'item3', 'item4', 'item5']
有另外一个数组存放一组对象:
const sections = [
{ content: 'section1', index: 0 },
{ content: 'section2', index: 2 }
]
它每个对象表示的是会往原来的数组的index
坐标插入content
数据(index
不会重复):
0 1 2 3 4
item1 itme2 item3 item4 item5
^ ^
| |
section1 section2
最后结果是:['section1', 'item1', 'item2', 'section2', 'item3', 'item4', 'item5']
请你完成injectSections
函数,可以达到上述的功能
injectSections(
['item1', 'item2', 'item3', 'item4', 'item5'],
[
{ content: 'section1', index: 0 },
{ content: 'section2', index: 2 }
]
) // => ['section1', 'item1', 'item2', 'section2', 'item3', 'item4', 'item5']
实现
我他妈就是个傻子。
上来直接往里插入,遍历sections
然后插入,难道就不知道插入完了之后原来的items
数组顺序就变了?
二逼一个
两个思路
思路1
第一个思路,从前往后插入的时候,后面的下标会发生变化,那就反过来插入,从后往前插入就不会受到影响了
所以,现在的关键点就是将sections
按照index
排序
眼熟吗
sections.sort((a, b) => b.index - a.index)
然后就没什么难度了
const injectSections = (items, sections) => {
if (!Array.isArray(items) || !Array.isArray(sections)) {
return
}
const temp = [...items];
[...sections].sort((a, b) = > (b.index - a.index)).forEach(section = > {
temp.splice(section.index, 0, section.content)
});
return temp
};
思路2
第二个思路,直接向数组中插入数据会影响下标,那么我把数组中的每一项都变成数组,在想内层数组插入数据就没问题了,最后在展平就行了
现在的关键的就是展平二维数组
学到了一个方法,拼接数组cancat
的用法
[].concat(arr1, arr2)
我们要展平的数据是:
const a = [[a], [b]]
直接调用不行,可以使用下面这种形式,将数组传进去:
Array.prototype.concat.apply([], a)
或者用解构的形式传入参数:
[].concat(...temp)
好了,接下来又没难度了
const injectSections2 = (items, sections) => {
const temp = [...items].map(v = > ([v]));
sections.forEach(section = > {
temp[section.index].unshift(section.content)
});
// return Array.prototype.concat.apply([], temp)
return [].concat(...temp)
};