【问题标题】:How to filter data with lodash如何使用 lodash 过滤数据
【发布时间】:2019-10-09 16:53:00
【问题描述】:

我的代码如下:

data = [
  {id: "15130", state: "INITIAL"},
  {id: "15129", state: "LOCKED"},
  {id: "10314", state: "APPROVED"},
  {id: "51", state: "APPROVED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
]

filters = [{id: "2", name: "LOCKED", count: 2}]

let result = []

_.forEach(data, (ca) => {  
  if (filters.length > 0) {
    if (!_.some(filters, (item) => item.name === ca.state.includes('LOCKED') ? "LOCKED" : ca.state))
      return;
  }
  result.push(ca);
});

console.log(result)

我想从状态包括"LOCKED" 的数据中获取所有记录。因此结果应该是:

result = [
  {id: "15129", state: "LOCKED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
]

但我得到了结果中的所有记录。

Here is the fiddle.

知道我做错了什么吗?

【问题讨论】:

  • count在这里有意义吗?
  • @NinaScholz 没有。只有name 重要。

标签: javascript arrays object ecmascript-6 lodash


【解决方案1】:

不需要 Lodash,您可以使用 Vanilla JavaScript 的 Array.filter(),然后使用 Array.includes() 检查 state 中的字符串值是否包含字符串 'LOCKED'。

const data = [
  {id: "15130", state: "INITIAL"},
  {id: "15129", state: "LOCKED"},
  {id: "10314", state: "APPROVED"},
  {id: "51", state: "APPROVED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
]

const res = data.filter(obj => obj['state'].includes('LOCKED'));

console.log(res);

但是,请注意 Array.includes() 不是 widely supported

【讨论】:

  • 我也可以有filters = [{id: "2", name: "LOCKED", count: 2}, {id: "1", name: "APPROVED", count: 2}]
  • @Boky 我明白了!基本上,过滤状态可以包括“锁定”或“批准”的记录?
  • APPROVED 始终是 APPROVED,但使用 LOCKED 我可以拥有 LOCKED_APPROVED、LOCKED_INITIAL 和 LOCKED。因此,对于 APPROVED 我不需要包含,它可以是 === 但对于 LOCKED 我需要包含。
  • 我认为拥有一个您想要排除的完全匹配的列表会更干净,而不是对状态进行部分匹配。想象一下,将来会出现一个“解锁”状态,此时它部分匹配“锁定”并被过滤掉。编辑:只是为了澄清-这是针对OP的。此解决方案仅遵循 OP 的要求。
  • 在这种情况下,它遵循类似的逻辑 - 遍历过滤器列表,并根据状态有条件地处理它?
【解决方案2】:

您可以通过检查过滤器数组的每个name 来过滤数组。

var data = [{ id: "15130", state: "INITIAL" }, { id: "15129", state: "LOCKED" }, { id: "10314", state: "APPROVED" }, { id: "51", state: "APPROVED" }, { id: "10313", state: "APPROVED_LOCKED" }, { id: "10315", state: "APPROVED_LOCKED" }],
    filters = [{ id: "2", name: "LOCKED", count: 2 }, { id: "1", name: "APPROVED", count: 2 }],
    result = data.filter(({ state }) => filters.some(({ name }) => state.includes(name)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:
    const allowedStatus = ["APPROVED_LOCKED", "LOCKED" ];
    
    data.filter(filter => allowedStatus.includes(filter.state));
    

    您可以拥有一个具有允许状态的数组并用它过滤数据。试试上面的代码。

    【讨论】:

      【解决方案4】:

      如何使用lodash

      由于您不需要修改原始数组,您可以使用 _.filter 。所需的参数是输入数组和用于过滤提供的数组的谓词。

          const data = [
            {id: "15130", state: "INITIAL"},
            {id: "15129", state: "LOCKED"},
            {id: "10314", state: "APPROVED"},
            {id: "51", state: "APPROVED"},
            {id: "10313", state: "APPROVED_LOCKED"},
            {id: "10315", state: "APPROVED_LOCKED"}
          ]
      
          const result = _.filter(data, (elem => {return elem.state.includes("LOCKED")}));
      
          console.log(result);
      <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

      如果您想修改原始数组,_.remove 是一个选项。

      【讨论】:

        【解决方案5】:

        你可以使用纯JS:

         
        
        const data = [
          {id: "15130", state: "INITIAL"},
          {id: "15129", state: "LOCKED"},
          {id: "10314", state: "APPROVED"},
          {id: "51", state: "APPROVED"},
          {id: "10313", state: "APPROVED_LOCKED"},
          {id: "10315", state: "APPROVED_LOCKED"}
        ];
        
        const res = data.filter(({ state }) => state.includes("LOCKED"));
        
        console.log(res);
         
        
        .as-console-wrapper { max-height: 100% !important; top: auto; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 2017-05-05
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多