数组插入指定元素的问题

比如有个数组a=[1,2,3,4,5,6,7,8,9,10,11,12],
我随机去掉4个数2,4,8,11,a就变成了a=[1,3,5,6,7,9,10,12]
然后呢,现在又要把去掉的4个数里随机选1个数或者全部4个数放回数组a里他的原位置
想过思路了,也写了代码,但是运行出来不太对,求助大神帮忙看看呢
可能是个简单的问题,但是一下子没想到思路,就卡住了

阅读 2.9k
7 个回答

你说的'原来的位置'请具体解释一下

比如说你所谓的原来的位置是, 7就在7, 12就在12,就算出现了[1,2,,,,,7]那也算7的话,
[1,2,3,4]我拿出2,3,4, 放回4就变成[1,,,4],你要的是这个效果么???

那么你第一次就不要一个拿出来, 先记录位置然后统一拿出来, 这样就之后后续谁放在哪.

具体要看你的题目的具体需求啊

具体看需求嘛,第一步的移除数据,如果只是为了使用,那么建议加标记,比如把数组改为

[{val: 1, deleted: false}, {val: 2, deldeleted: true}]

然后就可以比较方便的假装移除了,或者还原回来了。

我想你要表达的所谓放回去是还是原来的顺序吧,对此,就是搜索插入的问题。

感觉这个跟之前做的拖动排序很像。可以试下将原有数组转为对象数组,[{position:索引位置,value:原值}...],随机删除对象数组中的元素,删除前保留删除的对象数据,插入时直接 push 到数组里就好了,想按原有顺序排序,只要根据 position 字段进行过滤读取 value 值出来就好了。

let a = [1,2,3,4,5,6,7,8,9,10,11,12]
a.map((val,index)=>{
    return {position: index,value:val}
})
// 后续操作略

如果数组已经变了, 像你这种等差数组, 那就去循环对比前后两个差值然后塞进去就可以了

数组的添加或者删除尽量不要用索引去操作,因为索引是会变动的,尤其是在删除的时候。
你可以试试我写的这个。


class Test {

        constructor(arr) {
                this.arr = arr; // 获取arr
                this.delete_ = {}; // 用来记录被删除的内容
                this.arr_ = [];
        }

        delete(delArr) {
                this.arr_ = this.arr.filter( (data, index) => {
                    if(delArr.includes(data)) {  // 遍历数组,如果删除列表里面有这个内容
                        this.delete_ [data] = true;  //记录删除
                        return false; //过滤掉
                    }
                    return true; // 不过滤
                })
                return this.arr_;
        }

        restore(resArr) {
            resArr.forEach(data => {
                if(this.delete_[data])
                    delete this.delete_[data]; // 如果被记录在删除列表里面,吧这个删除内容给清除
            })
            this.arr_ = this.arr.filter(data => !this.delete_[data]); // 然后重新过滤
            return this.arr_; 
        }

}

var t = new Test([1,1,2,3,3,9,7]);
var c  = t.delete([1,3]);
console.log(c); //[ 2, 9, 7 ]
var d = t.restore([3]);
console.log(d); //[ 2, 3, 3, 9, 7 ]
var n = t.restore([1]);
console.log(n) //[ 1, 1, 2, 3, 3, 9, 7 ]

试试这个吧

我觉得最好的办法,就是不要拿出来。给每一个值转换一下成对象,按照第一个人回答的一样的思路。使用变量valid控制是否展示。

优点:

  • 原数组大小不变,不必创建新数组。
  • 只需要遍历valid就可以打印需要展示的数据。
  • 扩展性强,可以增加多个条件,比如:多次插入删除增加插入条件(插入原来的位置,插入原来位置的后一位,插入后删除前一位未删除的数据等等

等等)

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