js中几种遍历对象的方法,包括for.of、for

  js中几种遍历对象的方法,包括for..of、for..in、Object.keys、Object.getOwnProperty,它们在使用场景方面各有不同。

  js对象的属性中可直接用、可访问到的属性分为数据属性和访问器属性。

  数据属性(实际存储属性值的属性)的四大特性:

   {

  1. value: 属性值,
  2. writable: true/false, //控制是否可修改
  3. enumerable: true/false, //控制是否可被for in遍历
  4. configurable: true/false, //1. 控制是否可删除 2. 控制是否可修改前两个特性 3.一旦改为false不可逆
  5. }

  访问器属性(不实际存储数据,专门提供对其它数据/变量的保护)的四大特性:

   {

  1. get:function(){return this.隐藏属性;},
  2. set:function(val){
  3. //如果val符合条件
  4. this.隐藏属性=val
  5. //否则
  6. 报错
  7. },
  8. enumerable, configurable

  for..in

  返回的是所有能够通过对象访问的、可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例,不能保证属性按对象原来的顺序输出。(可枚举-自身-原型)

   var obj = {a:1, b:2, c:3};

  1. for (var prop in obj) {
  2. console.log("obj." + prop + " = " + obj[prop]);
  3. }
  4. // Output:
  5. // "obj.a = 1"
  6. // "obj.b = 2"

  Object.keys

  用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性名组成的数组。注意它同for..in一样不能保证属性按对象原来的顺序输出。(可枚举-自身)

   // 数组

  1. var arr = ['a', 'b', 'c'];
  2. console.log(Object.keys(arr)); // console: ['0', '1', '2']
  3. // 类数组对象
  4. var obj = { 0: 'a', 1: 'b', 2: 'c' };
  5. console.log(Object.keys(obj)); // console: ['0', '1', '2']
  6. // 类数组对象-随机下标
  7. var anObj = { 100: 'a', 2: 'b', 7: 'c' };
  8. console.log(Object.keys(anObj)); // console: ['2', '7', '100']
  9. // 不可枚举属性getFoo
  10. var myObj = Object.create({}, {
  11. getFoo: {
  12. value: function () { return this.foo; }
  13. }
  14. });
  15. myObj.foo = 1;

  Object.getOwnProperty

  如果你想获取一个对象的所有属性js map 遍历对象数组,甚至包括不可枚举的,则可用该方法。其返回对象的所有自身属性的属性名组成的数组,但不会获取原型链上的属性。(可枚举&不可枚举-自身)

   //获取不可枚举属性

  1. var my_obj = Object.create({}, {
  2. getFoo: {
  3. value: function() { return this.foo; },
  4. enumerable: false
  5. }
  6. });
  7. my_obj.foo = 1;

  下面的例子演示了该方法不会获取到原型链上的属性:

   function ParentClass() {}

  1. ParentClass.prototype.inheritedMethod = function() {};
  2. function ChildClass() {
  3. this.prop = 5;
  4. this.method = function() {};
  5. }
  6. ChildClass.prototype = new ParentClass;
  7. ChildClass.prototype.prototypeMethod = function() {};
  8. console.log(
  9. Object.getOwnPropertyNames(
  10. new ChildClass() // ["prop", "method"]
  11. )

  for..of

  es6新增方法,主要来遍历可迭代的对象(包括Array, Map, Set, arguments等),它主要用来获取对象value值,而for..in主要获取对象key值。

  另外:可以由break, continue, throw 或return终止。在这些情况下,迭代器关闭。

   let iterable = [10, 20, 30];

  1. for (let value of iterable) {
  2. value += 1;
  3. console.log(value);
  4. }
  5. // 11
  6. // 21

  与for..in循环之间的区别:

   Object.prototype.objCustom = function() {};

  1. Array.prototype.arrCustom = function() {};
  2. let iterable = [3, 5, 7];
  3. iterable.foo = 'hello';
  4. for (let i in iterable) {
  5. console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom"
  6. }
  7. for (let i in iterable) {
  8. if (iterable.hasOwnProperty(i)) {
  9. console.log(i); // 0, 1, 2, "foo"
  10. }
  11. }
  12. for (let i of iterable) {
  13. console.log(i); // 3, 5, 7

  小结

  其实这几个方法之间的差异主要在属性是否可可枚举js map 遍历对象数组,是来自原型,还是实例。

  开发中的实际应用

  需求:将如下两个从后台不同端口获取的json对象数组整合处理成如下注释部分的json对象

   var goodsSpecJSON = [{

  1. "SpecA": "颜色"
  2. }, {
  3. "SpecB": "容量"
  4. }, {
  5. "SpecC": "大小"
  6. }, {
  7. "SpecD": "尺寸"
  8. }, {
  9. "SpecE": "套餐"
  10. }];
  11. var goodsSpecList = [{
  12. c_id: 3133,
  13. costPrice: 0,
  14. discountPrice: 0,
  15. earn: 0,
  16. etime: null,
  17. flag: 0,
  18. goodsDetailCount: 199,
  19. goodsDetailId: "100PgQ2xy08121409mY27",
  20. goodsDetailInventory: 199,
  21. goodsDetailOff: 0,
  22. goodsDetailPic: "/upload/messageImage/1523281057461_Personal.jpg,/upload/messageImage/1523282906972_Personal.jpg,/upload/messageImage/1523283570897_Personal.jpg",
  23. goodsDetailPrice: 188,
  24. goodsDetailSpec: "",
  25. goodsId: "00Y1kR4r1029X822731o0",
  26. isHost: 0,
  27. managerEarn: 0,
  28. postage: 10,
  29. profit: 0,
  30. specA: "红色",
  31. specB: "32G",
  32. specC: "小",
  33. specD: "4.7寸",
  34. specE: "套餐一",
  35. unionEarn: 0,
  36. vipPrice: 0
  37. }, {
  38. c_id: 3134,
  39. costPrice: 0,
  40. discountPrice: 0,
  41. earn: 0,
  42. etime: null,
  43. flag: 0,
  44. goodsDetailCount: 199,
  45. goodsDetailId: "100PgQ2xy08121409mY27",
  46. goodsDetailInventory: 199,
  47. goodsDetailOff: 0,
  48. goodsDetailPic: "/upload/messageImage/1523281057461_Personal.jpg,/upload/messageImage/1523282906972_Personal.jpg,/upload/messageImage/1523283570897_Personal.jpg",
  49. goodsDetailPrice: 188,
  50. goodsDetailSpec: "",
  51. goodsId: "00Y1kR4r1029X822731o0",
  52. isHost: 0,
  53. managerEarn: 0,
  54. postage: 10,
  55. profit: 0,
  56. specA: "白色",
  57. specB: "64G",
  58. specC: "小",
  59. specD: "5寸",
  60. specE: "套餐二",
  61. unionEarn: 0,
  62. vipPrice: 0
  63. }, {
  64. c_id: 3135,
  65. costPrice: 0,
  66. discountPrice: 0,
  67. earn: 0,
  68. etime: null,
  69. flag: 0,
  70. goodsDetailCount: 199,
  71. goodsDetailId: "100PgQ2xy08121409mY27",
  72. goodsDetailInventory: 199,
  73. goodsDetailOff: 0,
  74. goodsDetailPic: "/upload/messageImage/1523281057461_Personal.jpg,/upload/messageImage/1523282906972_Personal.jpg,/upload/messageImage/1523283570897_Personal.jpg",
  75. goodsDetailPrice: 188,
  76. goodsDetailSpec: "",
  77. goodsId: "00Y1kR4r1029X822731o0",
  78. isHost: 0,
  79. managerEarn: 0,
  80. postage: 10,
  81. profit: 0,
  82. specA: "黑色",
  83. specB: "128G",
  84. specC: "小",
  85. specD: "4.7寸",
  86. specE: "套餐一",
  87. unionEarn: 0,
  88. vipPrice: 0
  89. }, {
  90. c_id: 3136,
  91. costPrice: 0,
  92. discountPrice: 0,
  93. earn: 0,
  94. etime: null,
  95. flag: 0,
  96. goodsDetailCount: 199,
  97. goodsDetailId: "100PgQ2xy08121409mY27",
  98. goodsDetailInventory: 199,
  99. goodsDetailOff: 0,
  100. goodsDetailPic: "/upload/messageImage/1523281057461_Personal.jpg,/upload/messageImage/1523282906972_Personal.jpg,/upload/messageImage/1523283570897_Personal.jpg",
  101. goodsDetailPrice: 188,
  102. goodsDetailSpec: "",
  103. goodsId: "00Y1kR4r1029X822731o0",
  104. isHost: 0,
  105. managerEarn: 0,
  106. postage: 10,
  107. profit: 0,
  108. specA: "蓝色",
  109. specB: "64GG",
  110. specC: "大",
  111. specD: "4.5寸",
  112. specE: "套餐二",
  113. unionEarn: 0,
  114. vipPrice: 0
  115. }];
  116. // var keys = {
  117. // '颜色': ['红色', '白色'],
  118. // '容量': ['8g', '16g', '32g', '64g'],
  119. // '尺寸': ['大', '小', '大'],
  120. // '套餐': ['套餐一', '套餐二', '套餐三']
  121. // };
  122. // //SKU,Stock Keeping Uint(库存量单位)
  123. // var sku_list = [{
  124. // 'attrs': '红色|16g|big|套餐二',
  125. // 'price': 120
  126. // }, {
  127. // 'attrs': '红色|8g|big|套餐一',
  128. // 'price': 10
  129. // }, {
  130. // 'attrs': '白色|16g|big|套餐二',
  131. // 'price': 28
  132. // }, {
  133. // 'attrs': '红色|64g|small|套餐三',
  134. // 'price': 220
  135. // }, {
  136. // 'attrs': '白色|32g|middle|套餐二',
  137. // 'price': 130
  138. // }, {
  139. // 'attrs': '红色|32g|big|套餐一',
  140. // 'price': 120

  实现:主要利用Object.keys方法获取对象的key,value值,配上forEach循环实现最终想要的结果。

   var keys = {};

  1. var sku_list = [];
  2. //原数据转换小写
  3. goodsSpecJSON = goodsSpecJSON.map(function (keyo) {
  4. var key = Object.keys(keyo)[0];
  5. var newkey = key.substring(0, 1).toLowerCase() + key.substring(1);
  6. var dic = {};
  7. dic[newkey] = keyo[key];
  8. return dic
  9. });
  10. //生成keys
  11. goodsSpecJSON.forEach(function (keyo) {
  12. var key = Object.keys(keyo)[0]; //['specA']
  13. var val = keyo[key]; //颜色
  14. if (!keys.hasOwnProperty(val)) {
  15. keys[val] = [];
  16. }
  17. var hash = {};
  18. goodsSpecList.forEach(function (item, i) {
  19. if (hash[item[key]] === undefined) {
  20. hash[item[key]] = true;
  21. keys[val].push(item[key]);
  22. }
  23. // if (keys[val].indexOf(item[key]) === -1) {
  24. // keys[val].push(item[key]);
  25. // }
  26. });
  27. });
  28. console.log(keys)
  29. //生成sku_list
  30. goodsSpecList.forEach(function (item) {
  31. var dic = {
  32. attrs: ''
  33. };
  34. goodsSpecJSON.forEach(function (keyo, j) {
  35. var key = Object.keys(keyo)[0];
  36. dic.attrs += item[key] + (j === goodsSpecJSON.length - 1 ? '' : '|');
  37. dic.price = item.goodsDetailPrice;
  38. dic.goodsDetailCount = item.goodsDetailCount;
  39. dic.goodsDetailId = item.goodsDetailId;
  40. });
  41. sku_list.push(dic);
  42. });

  输出结果:

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/1871
0 评论
799

发表评论

!