比如有个数组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里他的原位置
想过思路了,也写了代码,但是运行出来不太对,求助大神帮忙看看呢
可能是个简单的问题,但是一下子没想到思路,就卡住了
比如有个数组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里他的原位置
想过思路了,也写了代码,但是运行出来不太对,求助大神帮忙看看呢
可能是个简单的问题,但是一下子没想到思路,就卡住了
具体看需求嘛,第一步的移除数据,如果只是为了使用,那么建议加标记,比如把数组改为
[{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控制是否展示。
优点:
等等)
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
你说的'原来的位置'请具体解释一下
比如说你所谓的原来的位置是, 7就在7, 12就在12,就算出现了[1,2,,,,,7]那也算7的话,
[1,2,3,4]我拿出2,3,4, 放回4就变成[1,,,4],你要的是这个效果么???
那么你第一次就不要一个拿出来, 先记录位置然后统一拿出来, 这样就之后后续谁放在哪.
具体要看你的题目的具体需求啊