昨天在做删除列表功能时候碰到的坑 虽然很早以前知道 for(var i in arr)这种方法有坑 但是这么多年简写习惯了 就经常忽略了这个坑 昨天又碰到 特意分享给各位码友 下面我用几段代码举例
const arr = [2, 5]; const arr2 = [2, 5]; let list = [ '张三' , '李四' , '王五' , '张飞' , '关羽' , '刘备' , '曹操' ]; let list2 = [ '张三' , '李四' , '王五' , '张飞' , '关羽' , '刘备' , '曹操' ]; //若要从数组中删除下标为 arr 的值 即 王五 和 刘备 // 使用for循环遍历 arr 在进行删除 利用常见的for循环删除 /** * 方法1 得出结果 list为 * 0 : 张三 * 1 : 李四 * 2 : 张飞 * 3 : 关羽 * 4 : 刘备 * 并没有删除我们想要的值 * */ for ( var i in arr) { console.log( typeof (i)); //输出为string类型 list.splice([arr[i]], 1); console.log(arr) // 输出得 [2, 5]和 [2, 5, 01: NaN] arr.length > 1 && i != arr.length - 1 ? arr[i + 1] -= 1 : '' ; arr.length - 1 == i && this .setData({ list, }) } /** * 方法2 得出结果 list2为 * 0 : 张三 * 1 : 李四 * 2 : 张飞 * 3 : 关羽 * 4 : 曹操 * 和我们期望相符合 */ for ( var j = 0; j < arr2.length; j++) { console.log( typeof (j)); //输出为number list2.splice([arr2[j]], 1); console.log(arr2); //输出得 [2, 5] 和 [2, 4] arr2.length > 1 && j != arr2.length - 1 ? arr2[j + 1] -= 1 : '' ; arr2.length - 1 == j && this .setData({ list2, }) } |
由此可得 在碰到需要下标进行运算时候就不要简写了 感谢你的耐心观看 希望对你有所帮助
对于JSON对象和数组对象,都可以使用for(var i in 对象)来遍历
如果是数组最好使用for(var i = 0;i < 数组.length;i++)遍历,如果使用for(var i in 对象)来遍历,正常情况下不会有问题,但是:
// 原数组 a = [1,2,3] // for(var i = 0;i < 数组.length;i++)遍历 没问题 for(var i = 0;i < a.length;i++) console.log(i, a[i]) // for(var i in 数组)遍历 没问题 for(var i in a) console.log(i, a[i]) ======都是下面的预期结果======= 0 1 1 2 2 3 =============================== // 有时候为了方便,给它挂载了某个方法或属性,如 a.__proto__.myFunc = ()=>{} a.__proto__.myProperty = 88 // 打印a还是原数组,没什么区别 console.log(a) => [1,2,3] // for(var i = 0;i < 数组.length;i++)遍历 没问题 for(var i = 0;i < a.length;i++) console.log(i, a[i]) // for(var i = 0;i < 数组.length;i++)遍历 有问题了 for(var i in a) console.log(i, a[i]) ======不是预期结果======= 0 1 1 2 2 3 myFunc ()=>{} myProperty 88 =========================
删除数组中的值,可以使用filter 结合 使用 in json对象 的操作符,可以省掉很多代码
var delIdxs = {2:0, 5:0}; var delVal = {'王五':0, '刘备':0}; var list = ['张三','李四','王五','张飞','关羽','刘备','曹操']; // 使用索引删除 var a = list.filter((v, i)=>!(i in delIdxs)) // 使用值删除 var b = list.filter(v=>!(v in delVal)) console.log(a, b)
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
可以这样,设置enumerable 为 false,不可枚举
Object.defineProperty(a, 'myProperty', {
enumerable: false,
get(){return 88}
})
Object.defineProperty(a, 'myFunc', {
enumerable: false,
value(...param){
// your code
}
})
这次使用for(var i in a) console.log(i, a[i])就不会出现非预期结果了
arr2.length > 1 && j != arr2.length - 1 ? arr2[j + 1] -= 1 :
''
;为什么要有这一步操作
用用 map() 会发觉更好用
有删除的用filter
for in 是用来遍历对象的 foreach才是遍历数组的
你好,我也是做了一个删除功能,数组里的删除了,但是页面上没有及时加载出来,请问这是为什么啊
for in 一般用于对象的遍历吧,一般遍历数组用的数for