使用拼接从数组中删除空值
我试图做一个函数来从多维数组中删除空值,但它不工作得很好。 它不会穿透到最后一层数组,并且当两个空值相邻时不会移除。
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;
}
迭代时,不要从对象中移除元素。
不要for ... in
阵列。
请利用filter
和map
等高阶函数。 尝试这个:
function removeEmptyArrayElements(arr) {
if (!isArray(arr)) {
return arr;
} else {
return arr.filter( function(elem) {
return elem !== null
} ).map(removeEmptyArrayElements)
}
}
说明:
“高阶”函数是使用其他函数作为值的函数 - 既可以接受它们作为参数,也可以返回它们,或者两者兼有。 在这种情况下,我使用了Javascript的Array类的两个方法,它们接受一个函数作为参数,并使用它来构建并返回一个新数组。
someArray.filter(
function )
对someArray
每个元素调用函数,并返回一个仅包含函数返回true的元素的新数组。 我在这种情况下传递的函数是function(elem) { return elem !== null }
- 也就是说,如果元素不为null,则返回true。 因此,该filter
调用的结果是删除了所有空值的原始数组。
现在我们想从结果的任何元素中删除它们自己数组中的任何空值。 我用那个map
。 someArray.map(
function )
也调用数组的每个元素的函数,但不是根据这些结果返回其输入的子集,而是仅返回结果。 例如, [1,2,3].map(function(x){return x*2})
返回数组[2,4,6]
。 在这种情况下,我们传递的函数是我们正在定义的函数..递归调用removeEmptyElements
。
我们确实需要一种方法来阻止这种无休止的调用自己的循环,这就是外部if
是 - 当调用一个不是数组的元素时,我们只是按原样返回它。
你正在循环你正在删除的数组。 这给你“两个空值相邻时不删除”的错误。 “它没有渗透到最后一层数组”部分可能是因为你没有重新赋值obj[key]
。 数组按值复制,未被引用。
我会这样做:
function isArray(obj) {
// http://stackoverflow.com/a/1058753/1252748
return Object.prototype.toString.call(obj) === '[object Array]';
}
function removeEmptyArrayElements(arr) {
var i;
for (i = 0; i < arr.length; i += 1) {
if (arr[i] === null) {
arr = arr.splice(i, 1);
i -= 1; // decrement counter!
} else if (isArray(arr[i])) {
arr[i] = removeEmptyArrayElements(arr[i]);
}
}
return arr;
}
链接地址: http://www.djcxy.com/p/37761.html
上一篇: remove null values from arrays with splice
下一篇: How to get value before last forward slash using Jquery