簡體   English   中英

數組中的javascript過濾器數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM