javascript - 如何使用 Lodash 过滤嵌套数组?

标签 javascript lodash

这是我的数组(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 编写条件。 如果数组中至少有一个 Selected 文档的 Status 不是 goodverygood,则此条件必须返回 TRUE


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

  1. 已选中
  2. 具有除goodverygood 之外的其他状态

如果在我的数组中至少有一个对象(isSelected = true,状态 = bad(或除 good 或 verygood 以外的任何对象)。 然后我想看到结果: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; 
    }

最佳答案

不用 lodash 也能做到 - Array#someArray#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);

关于javascript - 如何使用 Lodash 过滤嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913530/

相关文章:

javascript - 按两个最接近的字段对js数组进行排序

javascript - Lodash 或将两个对象数组与匹配键组合的最佳方法

javascript - 捕获表单字段并用它们重新填充表单

javascript - 我想将一个字符串放入数组的每个值,如下面的代码所示。但我不想使用太多 if 运算符

javascript - 如何修复 React 中的 "Invariant violation"错误

javascript - 使用 Lodash 操作 JSON

lodash - 错误: Cannot read property 'cloneDeep' of undefined Angular 5

javascript - 在 lodash 的 throttle 装饰器上使用 flush

javascript - 如何判断 HTML5 音频元素何时播放完毕?

javascript - 将输出结果拆分为 html 中同一表的两个水平部分