【问题标题】:Find and edit in nested array?在嵌套数组中查找和编辑?
【发布时间】:2019-07-27 00:41:12
【问题描述】:

我有一个动态变化的嵌套数组。我需要检查数组是否包含一个对象,然后修改该对象以保持其余项目相同。

示例:

var input = [
    ['a', 'b'],
    ['c', 'd'],
    ['e', ['f', 'g']],
    ['h', ['i', 'j']]
]

在这个嵌套数组中,我想找到f,改成f-is-found

var result = [
    ['a', 'b'],
    ['c', 'd'],
    ['e', ['f-is-found', 'g']],
    ['h', ['i', 'j']]
]

问题是f 可以改变它在数组中的位置,所以我不能使用任何硬编码的方式来访问数组。

感谢您的帮助,谢谢

【问题讨论】:

    标签: javascript arrays node.js


    【解决方案1】:

    您可以使用递归方法,通过遍历数组中的每个元素(并遍历每个内部数组等等...),然后检查您的当前值是否等于f,如果它是,你可以修改它,否则,如果当前值是一个数组,你可以使用相同的函数再次搜索该数组。

    请看下面的例子:

    const input = [
      ['a', 'b'],
      ['c', 'd'],
      ['e', ['f', 'g']],
      ['h', ['i', 'j']]
    ];
    
    function findAndChange(search, toadd, arr) {
      arr.forEach((val, i) => {
        if (!Array.isArray(val)) {
          if (val === search) {
            arr[i] = val + toadd;
          }
        } else {
          findAndChange(search, toadd, val);
        }
      });
    }
    
    findAndChange('f', '-is-found', input);
    console.log(input);

    【讨论】:

      【解决方案2】:

      不喜欢重新发明轮子。我们现在使用object-scan 进行很多数据处理,一旦您了解如何使用它,它就会非常强大。以下是您可以如何回答您的问题。

      请注意,输入已就地变异。如果您希望有多个 'f' 实例,您只需将 abort 更改为 false 并将 rnt 更改为 count 即可查看替换了多少实例。

      // const objectScan = require('object-scan');
      
      const input = [ ['a', 'b'], ['c', 'd'], ['e', ['f', 'g']], ['h', ['i', 'j']] ];
      
      const modify = (searchValue, replaceValue, data) => objectScan(['**'], {
        rtn: 'bool',
        abort: true,
        filterFn: ({ value, parent, property }) => {
          if (value === searchValue) {
            parent[property] = replaceValue;
            return true;
          }
          return false;
        }
      })(input);
      
      const r = modify('f', 'f-is-found', input);
      
      console.log(r); // true iff replace was executed
      // => true
      console.log(input);
      /* =>
        [ [ 'a', 'b' ],
          [ 'c', 'd' ],
          [ 'e', [ 'f-is-found', 'g' ] ],
          [ 'h', [ 'i', 'j' ] ] ]
      */
      .as-console-wrapper {max-height: 100% !important; top: 0}
      <script src="https://bundle.run/object-scan@13.8.0"></script>

      免责声明:我是object-scan的作者

      【讨论】:

        猜你喜欢
        • 2017-03-05
        • 2013-06-17
        • 2018-09-10
        • 2019-08-15
        • 2022-11-11
        • 2013-10-11
        • 2019-03-16
        • 1970-01-01
        • 2013-03-09
        相关资源
        最近更新 更多