使用lodash根据条件从对象数组中过滤数据

问题描述 投票:0回答:2

我有下面的对象数组,我需要根据整个数组使用lodash的条件来取一些它们。

我在lodash中使用了_.filter(data,condition),但是预期的结果还没有到来。

有人帮我解决这个问题吗?

条件:EarnCode <90 && Hours === 0(结果将跳过这些数据)。

请求数组集:

[
  {
    "id" : 1,
    "EmpId" : 100,
    "AcctCode" : "2001-00",
    "SuperID" : 2000,
    "ReportNo" : "20180213.2015-06.2768.6",
    "EarnCode" : 96,
    "Hours" : 0
  },
 {
    "id" : 3,
    "EmpId" : 100,
    "AcctCode" : "2001-00",
    "SuperID" : 2000,
    "ReportNo" : "20180213.2015-06.2768.6",
    "EarnCode" : 96,
    "Hours" : 0
  },
  {
    "id" : 2,
    "EmpId" : 100,
    "AcctCode" : "2001-00",
    "SuperID" : 2000,
    "ReportNo" : "20180213.2015-06.2768.6",
    "EarnCode" : 1,
    "Hours" : 0
  },
  {
    "id" : 5,
    "EmpId" : 100,
    "AcctCode" : "2001-00",
    "SuperID" : 2000,
    "ReportNo" : "20180213.2015-06.2768.6",
    "EarnCode" : 1,
    "Hours" : 3
  }
]

预期结果:

[
{
        "id" : 1,
        "EmpId" : 100,
        "AcctCode" : "2001-00",
        "SuperID" : 2000,
        "ReportNo" : "20180213.2015-06.2768.6",
        "EarnCode" : 96,
        "Hours" : 0
      },
{
        "id" : 3,
        "EmpId" : 100,
        "AcctCode" : "2001-00",
        "SuperID" : 2000,
        "ReportNo" : "20180213.2015-06.2768.6",
        "EarnCode" : 96,
        "Hours" : 0
      },
 {
        "id" : 5,
        "EmpId" : 100,
        "AcctCode" : "2001-00",
        "SuperID" : 2000,
        "ReportNo" : "20180213.2015-06.2768.6",
        "EarnCode" : 1,
        "Hours" : 3
      }
]
javascript node.js lodash
2个回答
3
投票

只是为了完整性,如果你坚持要使用lodash,请按照CRice的回答来解决这个问题。

const inputSet = [{
  "id": 1,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 96,
  "Hours": 0
}, {
  "id": 3,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 96,
  "Hours": 0
}, {
  "id": 2,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 1,
  "Hours": 0
}, {
  "id": 5,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 1,
  "Hours": 3
}]

// Negate your condition, filter keeps items where the condition is
// true, so for your example, you need either Hours to be non-zero
// OR for EarnCode to be greater than 90.
const resultSet = _.filter(inputSet, i => i.Hours !== 0 || i.EarnCode >= 90);
console.log(resultSet); // Includes items 1, 3, and 5.
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

2
投票

不需要使用lodash(如果你不想),因为内置数组.filter方法就足以做到这一点。

你所要做的就是给它正确的条件。在您的情况下,该项目没有0小时,EarnCode小于90.该条件可以表示为:

!(EarnCode < 90 && Hours === 0)

或等效地:

EarnCode >= 90 || Hours !== 0

使用第二个,您的过滤器可能如下所示:

const inputSet = [{
  "id": 1,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 96,
  "Hours": 0
}, {
  "id": 3,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 96,
  "Hours": 0
}, {
  "id": 2,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 1,
  "Hours": 0
}, {
  "id": 5,
  "EmpId": 100,
  "AcctCode": "2001-00",
  "SuperID": 2000,
  "ReportNo": "20180213.2015-06.2768.6",
  "EarnCode": 1,
  "Hours": 3
}]

// Negate your condition, filter keeps items where the condition is
// true, so for your example, you need either Hours to be non-zero
// OR for EarnCode to be greater than (or equal to) 90.
const resultSet = inputSet.filter(i => i.Hours !== 0 || i.EarnCode >= 90);
console.log(resultSet); // Includes items 1, 3, and 5.
© www.soinside.com 2019 - 2025. All rights reserved.