#94 按下标插入


  • 0
    administrators

    现在有一个数组存放字符串数据:

    ['item1', 'item2', 'item3', 'item4', 'item5']
    

    有另外一个数组存放一组对象:

    [
      { 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']
    

  • 1

    Array.prototype.concat.apply([],items)
    

    是个好东西
    items里每个元素转成数组,往里插完再concat.apply平整一次就好


  • 0
    administrators

    @elfish 这个想法可以


  • 0
    管理员

    比较原始的解法

    const injectSections = (arr1, arr2) => {
      arr2.sort((a, b) => a.index - b.index);
      let arr = [], j = 0;
      arr1.forEach((o, i) => {
        arr2[j] && arr2[j].index === i && arr.push(arr2[j++].content);
        arr.push(arr1[i]);
      })
      return arr;
    }
    

  • 0

    {
    //排倒序;
    sections.sort(function(a,b){
    return b.index-a.index
    })
    //从后面增加进去
    sections.map(item=>{
    if(item){
    items.splice(item.index,0,item.content)
    }
    })
    return items
    }


  • 0

    @elfish 可以具体说一下吧.没看明白你说的?多谢


  • 0

    @陈小俊
    arr2 = arr2.sort((a, b) => a.index - b.index)
    sort 函数直接是对数组的引用,改变的是原数组,
    直接 arr2.sort((a, b) => a.index - b.index) 就 ok


  • 0
    管理员

    @macro 好咯好咯


  • 1

    @macro

    const injectSections = (items, sections) => {
        sections.forEach(
            (v,i)=>{
                items[v.index]=[v.content,items[v.index]]
            }
        );
        return [].concat.apply([],items);
    }
    
    const injectSections = (items, sections) =>
        [].concat.apply(
            [],
            sections.reduce(
                (o,s)=>(o[s.index]=[s.content,o[s.index]]) && o,
                items
            )
        );
    
    const injectSections = (items, sections) => 
        sections
        .sort((a,b)=>b.index-a.index)
        .reduce((it,se)=>[].concat(it.splice(0,se.index),se.content,it),items)
    

  • 0

    因为序号不会重复,所以先由大的序号开始插入

    const injectSections = (items, sections) => {
      //倒序排列
      sections.sort((a,b) => b.index - a.index)
      //插入
      sections.forEach((m)=>{
        items.splice(m.index, 0, m.content)
      })
      return items
    }
    

  • 0

    const injectSections = (items, sections) => /* TODO */{
    for(let k of sections) {
    items[k.index] = [k.content, items[k.index]];
    }

    return [].concat(...items);
    }


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待