【问题标题】:How to remove element from an array using reduce?如何使用reduce从数组中删除元素?
【发布时间】:2020-02-17 22:07:39
【问题描述】:

尝试根据以下代码的某些逻辑过滤对象返回空数组,任何帮助将不胜感激尝试实现以下逻辑

1- 如果第一个对象(firstFillIndicator=Y,acceptDigitalFirstFill=Y)和第二个对象(firstFillIndicator = Y,acceptDigitalFirstFill=N)。这个对象应该被删除它的虚假。

2- 如果第一个 obj(firstFillIndicator=Y, acceptDigitalFirstFill=Y) 和第二个对象 (firstFillIndicator= N, acceptDigitalFirstFill=Y)。这个对象应该被删除它的虚假。

3- 如果两个对象都有 firstFillIndicator 并且 acceptDigitalFirstFill 有一些值是真实的。

main.ts

function validateSingleOrder(data){
  let isValid = false;
  const filteredDrugs = data.filter((item) => {
      isValid = isValidOrder(item);
      if(isValid){
        return true;
      } else {
        return false;
      }
  })

 return filteredDrugs;
}

function isValidOrder(item){
   item.rxInfos.reduce((a, c) => {
    return (a.acceptDigitalFirstFill === "Y" && c.firstFillIndicator === "Y") || (a.firstFillIndicator === "N" && c.acceptDigitalFirstFill === "N")
  });
}

console.log(validateSingleOrder(rxDetails));

数据

 const rxDetails = [
      {
            indexID: 1,
            rxInfos: [{
                    firstFillIndicator: "Y",
                    acceptDigitalFirstFill: "Y",
                    rxNumber: "1512"
                },
                {
                    firstFillIndicator: "Y",
                    acceptDigitalFirstFill: "N",
                    rxNumber: "16021"

                }
            ]
      },
      {
          indexID: 2,
          rxInfos: [{
                  firstFillIndicator: "Y",
                  acceptDigitalFirstFill: "Y",
                  rxNumber: "1512"
              },
              {
                  firstFillIndicator: "N",
                  acceptDigitalFirstFill: "Y",
                  rxNumber: "16021"

              }
          ]
      },
      {
          indexID: 3,
          rxInfos: [{
                  firstFillIndicator: "Y",
                  acceptDigitalFirstFill: "Y",
                  rxNumber: "1512"
              },
              {
                  firstFillIndicator: "N",
                  acceptDigitalFirstFill: "N",
                  rxNumber: "16021"

              }
          ]
      }
    ]

预期结果

[{
        indexID: 3
        rxInfoss: [{
                firstFillIndicator: "Y",
                acceptDigitalFirstFill: "Y",
                rxNumber: "1512"
            },
            {
                firstFillIndicator: "N",
                acceptDigitalFirstFill: "N",
                rxNumber: "16021"

            }
        ]
    },

];

【问题讨论】:

  • 不要使用reduce,这个用例不需要它。
  • isValidOrder() 永远不会返回值,因此总是会计算为false
  • 为什么在这里使用reduce?你 可以 但你也应该每次都为累加器返回一个值 - 你没有这样做。您只是一次比较两个对象,然后......就是这样。
  • 尝试使用过滤器代替reduce
  • 我真的很惊讶这不会引发错误。当您尝试取消引用 a 的属性时,您应该得到它们的任何长度超过 2,这将是一个布尔值。

标签: javascript typescript ecmascript-6 filter


【解决方案1】:

问题是isValidOrder函数不返回任何东西,无论如何,使用.every(..)之类的东西比在这种情况下使用.reduce(..)更合适,这里是一个例子:

const rxDetails = [{
    indexID: 1,
    rxInfos: [{
        firstFillIndicator: "Y",
        acceptDigitalFirstFill: "Y",
        rxNumber: "1512"
      },
      {
        firstFillIndicator: "Y",
        acceptDigitalFirstFill: "N",
        rxNumber: "16021"

      }
    ]
  },
  {
    indexID: 2,
    rxInfos: [{
        firstFillIndicator: "Y",
        acceptDigitalFirstFill: "Y",
        rxNumber: "1512"
      },
      {
        firstFillIndicator: "N",
        acceptDigitalFirstFill: "Y",
        rxNumber: "16021"

      }
    ]
  },
  {
    indexID: 3,
    rxInfos: [{
        firstFillIndicator: "Y",
        acceptDigitalFirstFill: "Y",
        rxNumber: "1512"
      },
      {
        firstFillIndicator: "N",
        acceptDigitalFirstFill: "N",
        rxNumber: "16021"

      }
    ]
  }
];


const result = rxDetails.filter(o => {
  return o.rxInfos.every(v => {
    return (v.firstFillIndicator === 'Y' && v.acceptDigitalFirstFill === 'Y') || (v.firstFillIndicator === 'N' && v.acceptDigitalFirstFill === 'N');
  });
});

console.log(result);

【讨论】:

  • 感谢示例,这就是我正在寻找的除此之外的内容,是否可以捕获已删除对象的 indexID?
  • @hussain 您可以使用以下方式获取所有已删除的对象:const removed = rxDetails.filter(o => !result.some(v => v. indexID === o.indexID)) 然后,您可以映射此数组以仅保留 ID const ids = removed.map(o => o.indexID)
猜你喜欢
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2021-10-23
  • 2019-04-09
相关资源
最近更新 更多