我正在尝试创建一个从多维数组中删除空值的函数,但它不能很好地工作.它不会穿透到最后一层数组,并且在两个空值相邻时不会删除.
function isArray(obj) {
// http://stackoverflow.com/a/1058753/1252748
return Object.prototype.toString.call(obj) === '[object Array]';
}
function removeEmptyArrayElements(obj) {
for (key in obj) {
if (obj[key] === null) {
obj = obj.splice(key, 1);
}
var isArr = isArray(obj[key]);
if (isArr) {
removeEmptyArrayElements(obj[key]);
}
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)
迭代时,不要从对象中删除元素.
不要for ... in在数组上使用.
利用像filter和的高阶函数map.试试这个:
function removeEmptyArrayElements(arr) {
if (!isArray(arr)) {
return arr;
} else {
return arr.filter( function(elem) {
return elem !== null
} ).map(removeEmptyArrayElements)
}
}
Run Code Online (Sandbox Code Playgroud)
说明:
"高阶"函数是使用其他函数作为值的函数 - 将它们作为参数接受,或者将它们作为参数,或者两者都返回.在这种情况下,我使用了两种Javascript的Array类方法,它接受一个函数作为参数,并使用它来构建和返回一个新数组.
someArray.filter( 函数 )调用每个元素的函数someArray并返回一个新数组,该数组只包含函数返回true 的元素.我在这种情况下传递的函数是function(elem) { return elem !== null }- 也就是说,如果元素不为null,则返回true的匿名函数.因此,该filter调用的结果是删除了所有空值的原始数组.
现在我们要从结果的任何元素中删除任何空值,这些元素本身就是数组.我用map它了.someArray.map( 函数 )也在数组的每个元素上调用函数,但它不是根据这些结果返回其输入的子集,而是仅返回结果本身.例如,[1,2,3].map(function(x){return x*2})返回数组[2,4,6].在这种情况下,我们传递的函数是我们正在定义的函数..递归回调removeEmptyElements.
我们确实需要一种方法来阻止这种无限循环的自我调用,这就是外在的东西if- 当调用一个不是数组的元素时,我们只是按原样返回它.
| 归档时间: |
|
| 查看次数: |
11849 次 |
| 最近记录: |