使用lodash在嵌套数组中查找对象

时间:2018-03-09 09:24:15

标签: lodash

我有类似的json数据:

    {

  "Sections": [
    {
      "Categories": [
        {
          "Name": "Book",
          "Id": 1,
          "Options": [
            {
              "Name": "AAAA",
              "OptionId": 111
            },
            "Selected": 0
        },
        {
          "Name": "Car",
          "Id": 2,
          "Options": [
            {
              "Name": "BBB",
              "OptionId": 222
            },
            "Selected": 0
        },


      ],
      "SectionName": "Main"
    },
    ... more sections like the one above

  ]
}

鉴于这些数据,我想根据其(类别)ID在一个部分中找到一个类别,并设置其选择的选项,我试过这个,但无法使其工作....注意类别Id在整个数据集中将是唯一的。

_.find(model.Sections, { Categories: [ { Id: catId } ]});

1 个答案:

答案 0 :(得分:2)

根据您的数据模型,看起来您正在尝试查找矩阵内的元素:章节可以有多个类别,而类别可以有多种类型(汽车,书籍......)。

我担心lodash中没有一个允许深度查找的功能,你必须以'传统'的方式实现它(几个fors)。

我提供的这种解决方案比传统的嵌套fors更具“功能性”。它还利用了这样一个事实:当你在forEach中显式返回false时,循环结束。因此,一旦找到具有提供的id的元素,就会结束循环并返回元素(如果找不到,则返回undefined)。

希望它有所帮助。

const findCategoryById = (sections, id) => {
  var category;
  _.forEach(sections, (section) => {
    category = _.find(section.Categories, ['Id', id]);
    return _.isUndefined(category);
  });
  return category;
};


const ex = {
  "Sections": [{
    "Categories": [{
        "Name": "Book",
        "Id": 1,
        "Options": [{
          "Name": "AAAA",
          "OptionId": 111
        }],
        "Selected": 0
      },
      {
        "Name": "Car",
        "Id": 2,
        "Options": [{
          "Name": "BBB",
          "OptionId": 222
        }],
        "Selected": 0
      }
    ],
    "SectionName": "Main"
  }]
};

console.log(findCategoryById(ex.Sections, 2));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>