算法练习07 按下标插入

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)
};

参考

猜你喜欢

转载自blog.csdn.net/duola8789/article/details/84549754