【问题标题】:How to filter out item based on properties?如何根据属性过滤掉项目?
【发布时间】:2019-05-29 14:01:59
【问题描述】:

我想重构代码使用过滤器而不是 lodash _forEach,下面的过滤器代码没有返回预期的响应。知道这里有什么错误吗?

main.js

const response = [];
const data = [{
    "isBrand": true,
    "drugName": "Lipitor",
    "specialtyPrice": {}
  },
  {
    "isBrand": false,
    "drugName": "Atorvastatin Calcium",
    "drugStrength": "80mg",
    "drugForm": "Tablet",
    "mailPrice": {
      "totalQuantity": 90,
      "rejectMessage": [{
        "settlementCode": "99",
        "settlementDesc": "Sorry, the system is temporarily:Lo sentimos,Intente(Código de error 85)"
      }]
    },
    "retailPrice": {
      "totalQuantity": 30,
      "rejectMessage": [{
        "settlementCode": "99",
        "settlementDesc": "Sorry, the system is temporarily:Lo sentimos,Intente(Código de error 85)"
      }]
    },
    "specialtyPrice": {}
  }
];
_.forEach(data, function(drug) {
  if (drug.retailPrice !== undefined || drug.mailPrice !== undefined) {
    response.push(drug);
  }
});

const filterItems = data.filter(item => item.retailPrice && item.mailPrice)

console.log(filterItems);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

预期结果

[{
            "isBrand": false,
            "drugName": "Atorvastatin Calcium",
            "drugStrength": "80mg",
            "drugForm": "Tablet",
            "mailPrice": {
                "totalQuantity": 90,
                "rejectMessage": [{
                    "settlementCode": "99",
                    "settlementDesc": "Sorry, the system is temporarily:Lo sentimos,Intente(Código de error 85)"
                }]
            },
            "retailPrice": {
                "totalQuantity": 30,
                "rejectMessage": [{
                    "settlementCode": "99",
                    "settlementDesc": "Sorry, the system is temporarily:Lo sentimos,Intente(Código de error 85)"
                }]
            },
            "specialtyPrice": {}
        }
    ];

【问题讨论】:

  • 您已将 || 更改为 &&。此外,并非每个 falsy 值都是 undefined
  • 这段代码运行良好
  • 我看不出结果和想要的结果有什么区别。
  • 对我来说很好用

标签: javascript arrays ecmascript-6


【解决方案1】:

这应该可行。

var objNotEmpty = function(obj){
    return Object.keys(obj).length > 0;
 },
 objHasPrice = function(obj){
    return obj.hasOwnProperty("mailPrice") && obj.hasOwnProperty("retailPrice");
 };


const filterItems = data.filter( item => return objHasPrice(item) && objNotEmpty(item.mailPrice) && objNotEmpty(item.retailPrice);

【讨论】:

    【解决方案2】:

    你可以像这样简单地做Array.forEach

    data.forEach(d => (d.retailPrice || d.mailPrice) ? response.push(d) : null)
    

    所以它看起来像这样:

    const response = [];
    const data = [{
        "isBrand": true,
        "drugName": "Lipitor",
        "specialtyPrice": {}
      },
      {
        "isBrand": false,
        "drugName": "Atorvastatin Calcium",
        "drugStrength": "80mg",
        "drugForm": "Tablet",
        "mailPrice": {
          "totalQuantity": 90,
          "rejectMessage": [{
            "settlementCode": "99",
            "settlementDesc": "Sorry, the system is temporarily:Lo sentimos,Intente(Código de error 85)"
          }]
        },
        "retailPrice": {
          "totalQuantity": 30,
          "rejectMessage": [{
            "settlementCode": "99",
            "settlementDesc": "Sorry, the system is temporarily:Lo sentimos,Intente(Código de error 85)"
          }]
        },
        "specialtyPrice": {}
      }
    ];
    
    data.forEach(d => (d.retailPrice || d.mailPrice) ? response.push(d) : null)
    
    const filterItems = data.filter(item => item.retailPrice && item.mailPrice)
    
    console.log(filterItems);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多