过滤包含对象的数组中的对象

8

我有一个关于筛选嵌套对象数组的问题。

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

我希望获取所有费用总和大于35的对象。如何进入 expenses?或者说过滤器不是这里合适的方法。

你使用什么代码进行评估? - Neo
将它改为25。如何迭代并获取所有费用的值,并过滤该对象? - Kamil Staszewski
25仍然太高。 - Pavlo
1
我想要接收那些费用对象内值的总和超过25的对象。这是一个例子。你的代码不起作用 : / - Kamil Staszewski
显示剩余3条评论
5个回答

10

只需使用条件对 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);


我们有获胜者。谢谢! - Kamil Staszewski
很高兴能帮到你 ;) 别忘了将答案标记为已接受,这样可以帮助其他社区成员 :) - sjahan
我之前不知道Object.values。太好了! - Donny Verduijn

1
我假设您需要保留用户数组,但筛选出支出。 (根据评论所指,我的假设是错误的,但仍然保留此答案以防有人发现任何价值) 可能这可以被优化或简化,但下面是代码:
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

1
OP想要获取所有用户对象,其费用的总和大于N。他们不想过滤费用。 - Felix Kling

0
你可以尝试这样做:

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);


0

您可以使用表达式 arr[i] 访问数组 arr 内的索引 i 上的对象。 您需要做的是循环遍历数组。在循环内部,您可以使用我提到的表达式 arr[i] 访问每个对象,然后通过以下方式访问此对象的开销:arr[i].expenses。接下来 - 如果我理解正确的话,您需要对 arr[i].expenses 对象的内容进行求和,并选择满足您条件的对象。 请参见以下代码:

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中获得了结果


-3
可能的解决方案如下: arr.filter(function(v){ for(expense in v.expenses){ if(v.expenses[expense] > 10){ return true; }else{ return false; } } })

该代码片段是一个用于过滤数组的函数,它会返回所有支出超过10的元素。

1
为什么应该让 OP 尝试这个?这个方法是如何解决他们的问题的? - Felix Kling
3
所以,如果他们问如何求所有属性值的总和,而你展示如何访问单个属性,是因为直接回答问题会太过简单了吗?O_o - Felix Kling
不,他们正在尝试解决一个问题,并且已经尝试了一些没有起作用的方法(并非 OP 这样做)。我们帮助他们解决代码中具体的问题,而不是从头开始编写解决方案! - Velimir Tchatchevsky
1
我同意。但是,如果你只是说“试试这个”,那似乎意味着你正在提供一个完整的解决方案来解决他们的问题。但事实并非如此。你的代码示例有些相关,但并不能产生他们想要的结果。因此,至少你应该解释一下你正在做什么以及这如何帮助他们解决问题。 - Felix Kling
@FelixKling 可能措辞不太明确,我的意思恰恰相反——指出如何访问数组,将问题的另一部分留给OP。 - Velimir Tchatchevsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接