簡體   English   中英

使用對象內的對象過濾數組

[英]Filtering array with objects inside an object

我有一個使用嵌套對象過濾數組的問題。

[{
    "firstName": "Kevin",
    "lastName": "Smith",
    "expenses": {
      "drink1": 25,
      "drink2": 20
    }
  },
  {
    "firstName": "John",
    "lastName": "Rambo",
    "expenses": {
      "coffe": 10,
      "cake": 20
    }
  }
]

我想得到所有費用總和> 35的物品。如何獲得內部expenses 或者過濾器在這里可能不合適。

只需filter它,使用reduce的條件來計算費用! 挺直的:)

 const input = [{ "firstName": "Kevin", "lastName": "Smith", "expenses": { "drink1": 26, "drink2": 20 } }, { "firstName": "John", "lastName": "Rambo", "expenses": { "coffe": 10, "cake": 20 } } ]; const output = input.filter(user => Object.values(user.expenses).reduce((acc, expense) => acc + expense) > 45); console.log(output); 

你可以嘗試這樣的事情

 var data = [{ "firstName": "Kevin", "lastName": "Smith", "expenses": { "drink1": 25, "drink2": 20 } }, { "firstName": "John", "lastName": "Rambo", "expenses": { "coffe": 10, "cake": 20 } } ] var filtered = data.filter(c => Object.keys(c.expenses) .reduce(function(p, e) { return p + c.expenses[e] }, 0) >= 35 ); console.log(filtered); 

您可以使用表達式arr[i]訪問數組arr中索引i處的對象。您需要做的是遍歷數組。 在你的循環中你用我提到的表達式訪問每個對象: arr[i]然后在這個對象上你可以按照arr[i].expenses之后的方式訪問費用。在此之后 - 如果我正確理解你總結你的arr[i].expenses內容arr[i].expenses object並選擇那些滿足你條件的對象。 請看下面的代碼:

var expensesAbove35Arr = [];

var yourArray = [
        {
            "firstName": "Kevin",
            "lastName": "Smith",
            "expenses": {
                          "drink1": 26,
                           "drink2": 20
                        }
        },
        {
            "firstName": "John",
            "lastName": "Rambo",
            "expenses": {
                          "coffe": 10,
                           "cake": 20
                        }
        }
];

for(var i=0; i<yourArray.length; i++){
    if(yourArray[i].expenses.coffe + yourArray[i].expenses.cake > 35 ){
        expensesAbove35Arr.push(yourArray[i]);
    }
}

你已經在數組expensesAbove35Arr得到了你的結果

我假設您需要保持用戶數量的方式,但過濾費用。

(我在評論中指出錯誤,保留這個答案以防萬一有人看到它的任何價值)

可能這可以選擇或簡化,但在這里:

arr.reduce((acc, user) => [...acc,
  Object.keys(user).reduce((userResult, key) => {
    if (key === 'expenses') {
      return {
         ...userResult,
        expenses: Object.entries(elem.expenses)
          .filter(([product, value]) => value > 35)
          // now "reversing" the object.entries
          .reduce((acc, [product, value]) => ({ [product]: value }), {})
      }
    }
    return {
      ...userResult,
      [key]: elem[key]
    }
  }, user) // starts with the user
], []) //starts with empty array

可能的解決方案可能是:

arr.filter(function(v){ for(expense in v.expenses){ if(v.expenses[expense] > 10){ return true; }else{ return false; } } })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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