Fork me on GitHub

数组扁平化

你可能会看到这样一种情况,大概的描述就是一个数组里面包含了很多了数组,数组里面还可以再包含数组。或者是一个数组里面包含了很多个对象。

我们通常需要的只是一维的数组,此时就需要将数组降维进行扁平化处理。

数组的数据结构如下:

1
var arrObj = [{x: 1}, {y: 2}, {z: 3}];

需要将以上数组转化为一维的对象,如下:

数组转化成的一维对象

在开始前需要先了解以下知识点:

(1)forEach(ele, index, arr) 有三个参数,第一个为数组的每一项,第二个为当前元素的索引,第三个为原来的数组(即调用forEach的那个数组)。也可以传入第四个参数,代表this指向。

该方法和for循环的区别是:

forEach()循环没有办法终止或跳出。foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高

(2)for in循环通常用来遍历对象。用法为:for (var prop in obj),其中,prop为对象的属性名,obj为要遍历的对象,obj[prop]即为取出对象的属性值。

for in通常和hasOwnProperty()配合使用,意为先看prop属性是否是对象本身的(该属性不在原型上),来节约遍历成本。

具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function arrFlat (arr) {
var newObj = {};
arr.forEach(function (ele, index) {
// console.log(ele); //{x: 1} {y: 2} {z: 3}
for (var prop in ele) {
if(ele.hasOwnProperty(prop)) {
// console.log(ele[prop]) //1 2 3
newObj[prop] = ele[prop];
}
}
})
return newObj;
}

console.log(arrFlat(arrObj)); //函数调用,打印出结果

上面需要注意的是,如何取到对象的属性名并将对应的属性值赋给他。

这里的处理方法是通过声明一个新的对象,然后通过原来对象的prop取到具体的属性名,即newObj[prop]。ele[prop]取到的为原来对象的属性值。