[英]javascript filter array in array
我有以下基於文檔的代碼
var arr = [
{ id: 15 },
{ x: [{ id: 777 }, { id: 'xx' }, { notidproperty: 987 }]},
{ id: 1111 }
];
function filterByID(obj) {
if ('id' in obj && typeof(obj.id) === 'number' && !isNaN(obj.id)) {
return true;
} else if (Object.prototype.toString.call(obj) === '[object Array]') { //obj type is Object, not Array
obj.filter(filterByID);
} else {
return false;
}
}
var arrByID = arr.filter(filterByID);
console.log('expected length = 3, actual length = ' + arrByID.length);
console.log(arrByID);
如何過濾“arr”數組? 有沒有其他技術可以獲得正確的結果?
編輯:預期結果是過濾的對象數組,這些對象具有帶數值的 id 屬性
所以預期的 Id 值為 15, 777, 1111
我建議使用Array#reduce()
而不是Array#filter()
,因為您需要一個平面數組來計算結果。
我使用isFinite
作為檢查id
。
function rr(r, a) { Object.keys(a).forEach(function (k) { if (Array.isArray(a[k])) { r = r.concat(a[k].reduce(rr, [])); } else { isFinite(a.id) && r.push(a); } }); return r; } var arr = [{ id: 15 }, { x: [{ id: 777 }, { id: 'xx' }, { notidproperty: 987 }] }, { id: 1111 }], result = arr.reduce(rr, []); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
差不多好了。 在else if
您不返回任何內容。 代替
obj.filter(filterByID);
嘗試return (obj.filter(filterByID).length > 0);
因為如果遞歸 filterByID 的結果是一個長度大於 0 的數組,您希望將其添加到外部結果中。
您必須修改以下分支:
if (Object.prototype.toString.call(obj) === '[object Array]') { //obj type is Object, not Array
obj.filter(filterByID);
}
這僅過濾但不返回結果。 並且這里不會處理具有 Array 類型的 x 屬性的對象。 所以:
if(obj.x && Array.isArray(obj.x)){
return obj.x.filter(filterByID).length>0
}
或者:
if(obj.x && Array.isArray(obj.x)){
obj.x = obj.x.filter(filterByID)
return true
}
(取決於你想做什么)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.