【问题标题】:Dealing with looping through nested arrays处理嵌套数组的循环
【发布时间】:2021-10-14 14:14:22
【问题描述】:

我有数据数组,里面有嵌套数组 (level1arr, leve21arr ...)

const data = [
  {
    level1arr: [
      {
        level2arr: [{ id: 1, isValid: true }, { id: 2, isValid: true }, { id: 3, isValid: true }],
      },
      {
        level2arr: [{ id: 4, isValid: true }, { id: 5, isValid: true }, { id: 6, isValid: true }],
      },
    ],
  },
  {
    level1arr: [
      {
        level2arr: [{ id: 7, isValid: true }, { id: 8, isValid: true }, { id: 9, isValid: true }],
      },
      {
        level2arr: [{ id: 10, isValid: true }, { id: 11, isValid: true }, { id: 12, isValid: true }],
      },
    ],
  },
];

我还有另一个数组:

const invalidIds = [2,5]

我想查找具有 apecyfic id 的元素并将 isValid 属性更改为 false。 是不是比迭代多个嵌套数组更好的方法,像这样:

data.forEach(lvl1 => {
  lvl1.level1arr.forEach(lvl2 => {
    lvl2.level2arr.forEach(element => {
      // further nesting
    });
  });
}) 

这种对多个数组的迭代不利于性能。使用嵌套数组处理这种情况的最佳方法是什么?

【问题讨论】:

  • 如果您需要进行多次查找,最好的办法是将数据结构转换为更合适的形式。

标签: javascript arrays


【解决方案1】:

如果是嵌套数组,您可以使用Array.prototype.flat()。但是,您可以混合使用嵌套对象和数组。您将不得不为此数据结构编写一个自定义的“扁平化器”。详情请查看此答案:how to convert this nested object into a flat object?

【讨论】:

    【解决方案2】:

    您可以使用递归,直到达到您需要的级别。这是一种方法。

    const data = [{
        level1arr: [{
            level2arr: [{
              id: 1,
              isValid: true
            }, {
              id: 2,
              isValid: true
            }, {
              id: 3,
              isValid: true
            }],
          },
          {
            level2arr: [{
              id: 4,
              isValid: true
            }, {
              id: 5,
              isValid: true
            }, {
              id: 6,
              isValid: true
            }],
          },
        ],
      },
      {
        level1arr: [{
            level2arr: [{
              id: 7,
              isValid: true
            }, {
              id: 8,
              isValid: true
            }, {
              id: 9,
              isValid: true
            }],
          },
          {
            level2arr: [{
              id: 10,
              isValid: true
            }, {
              id: 11,
              isValid: true
            }, {
              id: 12,
              isValid: true
            }],
          },
        ],
      },
    ];
    
    const invalidIds =[2,5]
    
    const findId = (object, key, value) => {
      if (Array.isArray(object)) {
        for (const obj of object) {
          findId(obj, key, value);
        }
      } else {
        if (object.hasOwnProperty(key) && object[key] === value) {
          object.isValid = false;
          return object
        }
        for (const k of Object.keys(object)) {
          if (typeof object[k] === "object") {
            findId(object[k], key, value);
          }
        }
      }
    }
    
    invalidIds.forEach(id => findId(data, "id", id))
    console.log(data)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2016-01-11
      • 1970-01-01
      • 2012-11-01
      • 2022-05-12
      • 1970-01-01
      • 2021-08-07
      • 2016-11-01
      相关资源
      最近更新 更多