评论

数组再分的实现

简单记叙数组再分的实现

实现数组再分

开发的时候遇到了一个比较少见的关于数组的操作,如何根据数组中的某个键的属性值是否相同,重新整合数组中的值,如同代码示例中的根据数组的name属性,将name相同的数组元素重新组合在一起。最初的设想是for循环找出每个元素之后,内嵌一个for循环进行比对,找出相应数据存放,结果是数组中的数据重复打印。于是从网上搜索并解决问题,以下便是代码示例。

代码示例

//实验代码 未分组变量
  arrayDemo: [{
        "name": "z",
        "age": 15,
        "high": 10,
        "phone": 12345678911
      },
      {
        "name": "q",
        "age": 15,
        "high": 10,
        "phone": 12345678910
      },
      {
        "name": "w",
        "age": 15,
        "high": 10,
        "phone": 12345678912
      },
      {
        "name": "e",
        "age": 15,
        "high": 10,
        "phone": 12345678913
      },
      {
        "name": "r",
        "age": 15,
        "high": 10,
        "phone": 12345678914
      }, {
        "name": "z",
        "age": 15,
        "high": 10,
        "phone": 12345678915
      },
      {
        "name": "z",
        "age": 15,
        "high": 10,
        "phone": 12345678916
      }, {
        "name": "f",
        "age": 15,
        "high": 10,
        "phone": 12345678917
      }
    ]
 //调用数组排列方法
 this.arrayGroup(arrayDemo);
    
 /**
  * 数组分组
  */
  arrayGroup: function(array) {
    var groups = []; //存放新数组
    for (var i = 0; i < array.length; i++) { //遍历数组每一项
      // 读取每条数据的名称 取出 分类的条件
      var groupName = array[i].name;
      var groupValue = {      // 符合分类条件的属性值组合成对象放入新数组中value属性中
        'age': array[i].age,
        'high': array[i].high,
        'phone': array[i].phone
      }
      var groupItem = {  //新数组中存放的对象
        'name': '',
        value: []
      }
      groupItem.name = groupName;
      groupItem.value.push(groupValue); 
      if (i == 0) {      //设置为基准值进行对比
        groups.push(groupItem);
      } else { //遍历剩余数组项
        var index = -1; //第二层循环找到属性值相同的数组成员并且放入新数组中
        for (var k = 0; k < groups.length; k++) {
          if (groupName == groups[k].name) {
            index = k;
            break;
          }
        }
        if (index == -1) { //没有找到
          groups.push(groupItem);
        } else {
          groups[k].value.push(groupValue); //将属性值存放到新数组中
        }
      }
    }
    console.log('groups', groups);
  }

结果示例

解决这个问题之后,鉴于花费在这个问题上的时间,重新搜集了有关数组的操作方法记录下来,以减少下次花费时间。

数组相关方法扩展

filter()

filter()方法创建一个新数组, filter为数组中的每个元素调用一次 callback 函数,并利用调用callback函数返回true或等价于true的值的元素创建一个新数组。

filter语法:
var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
  /**
   * filterdemo 过滤掉所有小于10的数组项
   */
  filterDemo: function() {
    var filterArray = [12, 14, 8, 9, 100];
    var filterResult = filterArray.filter(function(item) {
      if (item > 10) {
        return true;
      }
    });
    console.log('filterResult', filterResult)
  }

map()

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

//map语法:
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
 // Return element for new_array 
}[, thisArg])
  /**
   * map方法示例 所有数组成员乘以5
   */
  mapDemo: function() {
    var mapArray = [1, 2, 3, 4, 5];
    var mapResult = mapArray.map(function(item) {
      return item * 5
    })
    console.log('mapResult', mapResult);
  }

foreach()

foreach()方法对数组中的每个元素执行一次提供的函数。

语法:
array.forEach(function(currentValue, index, arr), thisValue)

  /**
   * forEach 代码示例
   */
  forEachDemo: function() {
    var arr = [1, 5, 8, 9]
    arr.forEach(function(item) {
      console.log('item', item)
    })
  }
  
  /**
   * forEachDemo 无法使用break跳出循环
   */
  forEachDemo: function() {
    var arr = [1, 5, 8, 9]
    arr.forEach(function(item) {
      if (item == 1) {
        break
      }
      console.log('item', item)
    })
  }
  
  /**
   * forEach 被调用的时候,不会直接改变调用它的对象,但是对象可能会被callback改变原数组为  var words = ['one', 'two', 'three', 'four'];调用foreach后 原数组被改变 
   */
   forEachDemo: function() {
    var words = ['one', 'two', 'three', 'four'];
    words.forEach(function(word) {
      console.log(word);
      if (word === 'two') {
        words.shift();
      }
    });
  }


foreach无法使用break跳出循环

forEach 被调用的时候,不会直接改变调用它的对象,但是对象可能会被callback改变

for-in

for-in常用来遍历对象,以任意顺序去遍历一个对象可枚举的属性

  /**
   * for-in 实例 输出对象的属性
   */
  forInDemo: function() {
    var obj = {
      name: 'ar',
      color: 'yellow',
      day: 'sunday',
      number: 6,
      age:15
    }
    for (var key in obj) {
      console.log(obj[key])
    }
  }


在合适的场景下选用合适的数组操作方法,可以使得复杂的代码变得更加的易读和简练,更容易让人理解。

点赞 4
收藏
评论
登录 后发表内容