【问题标题】:How to filter nested array using Lodash?如何使用 Lodash 过滤嵌套数组?
【发布时间】:2016-12-01 14:46:02
【问题描述】:

这是我的数组 (http://www.jsoneditoronline.org/?id=cc51a12581667055781639b586fa6e15):

[
  {
    "documents": [
      {
        "name": "a",
        "isSelected": true,
        "status": "good"
      },
      {
        "name": "b",
        "isSelected": false,
        "status": "good"
      }
    ]
  },
  {
    "documents": [
      {
        "name": "a",
        "isSelected": true,
        "status": "bad"
      },
      {
        "name": "b",
        "isSelected": false,
        "status": "good"
      }
    ]
  },
  {
    "documents": [
      {
        "name": "a",
        "isSelected": true,
        "status": "verygood"
      },
      {
        "name": "b",
        "isSelected": false,
        "status": "good"
      }
    ]
  },
  {
    "documents": [
      {
        "name": "a",
        "isSelected": false,
        "status": "good"
      },
      {
        "name": "b",
        "isSelected": false,
        "status": "good"
      }
    ]
  }
]

我需要使用 _.lodash 编写条件。 如果数组中至少有一个带有StatusSelected 文档而不是goodverygood,则此条件必须返回TRUE


基于上面的数组。 http://prnt.sc/de3gx9 您可以在屏幕截图中看到,数组中是一个对象:

  1. 被选中
  2. 具有除goodverygood 以外的其他状态

如果在我的数组中至少有一个对象(isSelected = true,status = bad(或除好或非常好之外的任何对象)。 然后我想看看RESULT:TRUE

 function checkStatusInArray() {   
       var data = [....]; // this is my array

       var isDocumentSelectedWithWrongStatus = _.some(data, { isSelected: true, status: !"good" || !"verygood" });
       // So if in array are some items with isSelected = true and status != good || verygood, then isDocumentSelectedWithWrongStatus = TRUE

       return isDocumentSelectedWithWrongStatus; 
    }

【问题讨论】:

  • 你能澄清过滤条件吗?
  • 我添加了过滤器,因为我认为使用更少的对象会更容易
  • 我只想查看布尔结果。如果会有 isSelected = true 和 status = bad、worst、badly 或任何除了:good 或 verygood 的项目。
  • 请检查编辑中的代码。

标签: javascript lodash


【解决方案1】:

你可以不用lodash - Array#some里面的Array#some和谓词(谓词可以内联为匿名函数),如果谓词返回,结果将是真实的:

function checkData(data, predicate) {
  return data.some(function(item) {
    return item.documents.some(predicate);
  });
}

function predicate(document) {
  return document.isSelected && 
    !(document.status === 'good' ||
    document.status === 'verygood');
}

function checkData(data, predicate) {
  return data.some(function(item) {
    return item.documents.some(predicate);
  });
}

function predicate(document) {
  return document.isSelected && 
    !(document.status === 'good' ||
    document.status === 'verygood');
}

var data = [{
  "documents": [{
    "name": "a",
    "isSelected": true,
    "status": "good"
  }, {
    "name": "b",
    "isSelected": false,
    "status": "good"
  }]
}, {
  "documents": [{
    "name": "a",
    "isSelected": true,
    "status": "bad"
  }, {
    "name": "b",
    "isSelected": false,
    "status": "good"
  }]
}, {
  "documents": [{
    "name": "a",
    "isSelected": true,
    "status": "verygood"
  }, {
    "name": "b",
    "isSelected": false,
    "status": "good"
  }]
}, {
  "documents": [{
    "name": "a",
    "isSelected": false,
    "status": "good"
  }, {
    "name": "b",
    "isSelected": false,
    "status": "good"
  }]
}];

var result = checkData(data, predicate);

console.log(result);

【讨论】:

  • 你确定这是正确的吗?好像不能正常工作。
  • 好吧,当我试图以这种方式使用它时:var b = deepFilter(data, predicate); where data = my array,然后这个函数 deepFilter 分配给var b all arrays。
  • 代码 sn-p 返回 3 个对象。我想检查Data 中的selected 文档中是否包含status 而不是goodverygood。如果至少有一个。我想看到 TRUE。仅此而已。
  • 也许这个过滤器是一个不好的方法。无论如何,这个过滤器返回我的对象​​isSelected=true 所以在这种情况下只有数组的前 3 条记录。然而它什么也没给我。因为还有状态不是goodverygood 的文档。我会尝试在编辑中向您解释。
【解决方案2】:

您可以使用 lodash 的 flatMap 将文档提取到一个集合中,然后在该集合上使用 some

var data = [{"documents":[{"name":"a","isSelected":true,"status":"good"},{"name":"b","isSelected":false,"status":"good"}]},{"documents":[{"name":"a","isSelected":true,"status":"bad"},{"name":"b","isSelected":false,"status":"good"}]},{"documents":[{"name":"a","isSelected":true,"status":"verygood"},{"name":"b","isSelected":false,"status":"good"}]},{"documents":[{"name":"a","isSelected":false,"status":"good"},{"name":"b","isSelected":false,"status":"good"}]}]

var selectedButNotGood = function(document){
  return document.isSelected && 
    document.status != "good" && 
    document.status != "verygood"
}

var result = _.chain(data)
              .flatMap('documents')
              .some(selectedButNotGood)
              .value();

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

【讨论】:

    【解决方案3】:

    您可以遍历它们并创建自己的自定义数组。

    var d = [{"documents":[{"name":"a","isSelected":true,"status":"good"},{"name":"b","isSelected":false,"status":"good"}]},{"documents":[{"name":"a","isSelected":true,"status":"bad"},{"name":"b","isSelected":false,"status":"good"}]},{"documents":[{"name":"a","isSelected":true,"status":"verygood"},{"name":"b","isSelected":false,"status":"good"}]},{"documents":[{"name":"a","isSelected":false,"status":"good"},{"name":"b","isSelected":false,"status":"good"}]}]
    
    var statusList = ['good', 'verygood']
    var r = d.some(function(o) {
      return o.documents.filter(x => !statusList.includes(x.status) && x.isSelected).length > 0;
    });
    console.log(r)

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2017-02-19
      相关资源
      最近更新 更多