js 复杂数组的元素操作,实现数据按搜索条件在前端显示

10 篇文章 0 订阅

目录

0、背景

 1、坑一

 2、坑二

3、实现

3.1、js 数组元素操作

3.2 思路与代码

3.3、注意

4、最后的话


0、背景

       在工程项目中需要实现的一个需求,自己设计通过修改前端js代码来实现数据按搜索条件来对应显示的功能(实际可以根据key通过服务请求来实现的つ﹏⊂同事帮助下实现的)。在这个方向上,踏了很多坑,每次都觉得快实现了,可还是一直有问题。最后即使在同事另辟蹊径下解决的问题,但在不甘心下自己还是决定按自己思路将之实现掉。

请求后台上传的数据:

想要实现的功能效果:

  ===>>> 

 1、坑一

想用each遍历数据在其中根据条件过滤数据并返回

return _.each(datas,(function(index,item) {
  alert(index);
  alert(item);
  //过滤
  if(item[index].ID === condition)
  {
        view;
  }
}(this)));//错误的

 然后发现其中打印项index一直为[Object,object]而item就一直是underfunded,这个问题就很坑。没法获取索引值,就没法去用key来筛查数据。

然后发现代码写法上有所区别,

return _.each(datas,function(index,item) {
  alert(index);
  alert(item);
  //过滤
  if(item[index].ID === condition)
  {
        view;
  }
});//错误的

 这样虽然正确了,index为遍历的索引值,item为[Object,object]但是返回显示依旧无数据。然后这里面this的具体意义和用法也没有弄清楚。

 2、坑二

考虑对数据先过滤后遍历显示,遇到问题:1、复杂的对象数组怎么重新定义一个新的变量;2、如何向复杂的对象数组中添加对象元素;

网上查找了许久没能找到自己想要的答案(自己钻牛角尖了),以为需要创建object类型的数组,实际上复杂的对象型数组就是当作数组来操作即可

3、实现

3.1、js 数组元素操作

方法说明
.length数组的大小
.push(ele)尾部追加元素
.pop()获取尾部的元素
.unshift(ele)头部插入元素
.shift()头部移除元素
.slice(star,end)切片
.reverse()反转
.join(seq)将数组元素连接成字符串
.concat(val,...)

连接数组

.sort()排序
.forEach()将数组的每个元素传递给回调函数
.splice()删除元素,并向数组添加新元素
.map()返回一个数组元素调用函数处理后的值的新数组

该部分参考了:js 数组添加对象_Js -- 数组对象_weixin_39885803的博客-CSDN博客icon-default.png?t=L9C2https://blog.csdn.net/weixin_39885803/article/details/110747939

3.2 思路与代码

首先for循环,删除不满足条件的元素,形成新的数组;

再对新数组遍历显示。

if (datas.length !== 0) {
   // var newdatas = new Array();
   // for(i = 0;i < datas.length;i++)//顺序的删除会改变内部元素位置还是会漏掉一些元素
   // {
   //   if(datas[i].userId === name) {
   //     newdatas.push(datas.splice(i,1));//获取datas删除的object并加入newdatas
   //   }//获取了对象,并没有获取属性信息
   // }
   for(i = datas.length-1;i >= 0;i--)
   {
      if(datas[i].userId !== name) {
        datas.splice(i,1);//逆序delete this object
      }
   }
   console.log(datas.length); //datas变成了新的数组         
   return _.each(datas,(function(_this) {
      return function(dataModel) {
         var dataTabView;
         dataTabView = new Views.MapDataTabView({
            model: dataModel
         });
         return _this.$el.find(".data-manage-bottom #data-list").append(dataTabView.render());
      };
  }(this)));
} 

3.3、注意

1、使用splice删除数组内元素,会实时传递到数组内部的,从而改变内部各个元素的索引值,从而导致for循环删选漏洞,因此这里使用逆序删除,这样可避免此种问题。

定义和用法

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

注释:该方法会改变原始数组。

语法

arrayObject.splice(index,howmany,item1,.....,itemX)
参数描述
index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX可选。向数组添加的新项目。
返回值
类型描述
Array包含被删除项目的新数组,如果有的话。

 2、数组的定义,直接new即可,但是向数组中添加元素使用push方法,发现加入的元素没有继承原始元素内的属性信息。为此需要避免这个坑,我自己发现这个问题后就没有使用这种方式了。具体深究可以参考:

for循环对数组push一个对象时遇到的坑_许洪源的博客-CSDN博客icon-default.png?t=L9C2https://blog.csdn.net/weixin_40648700/article/details/111961160?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3.nonecase

4、最后的话

     以上只是针对功能实现,并没考虑工程维护和项目建设。对于这类似的功能需求,最好最优的实现方式还是通过后台服务请求来实现吧。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanke_yh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值