【问题标题】:Change . visible property in array by filtering based on array of indexes改变 。通过基于索引数组过滤的数组中的可见属性
【发布时间】:2018-12-21 19:59:04
【问题描述】:

需要通过将 array2 中不存在的索引设置为 false 来从 array1 创建一个新的 array3。

在下面的示例中,我有索引 0,2。所以结果数组必须对 1,3 可见为 false

var array1 = [{
    "visible": "true",
    "id": 0
}, {
    "visible": "true",
    "id": 1
}, {
    "visible": "true",
    "id": 2
}, {
    "visible": "true",
    "id": 3
}];

var array2 = [0,2]

预期结果:

array3 = [{
    "visible": "true",
    "id": 0
}, {
    "visible": "false",
    "id": 1
}, {
    "visible": "true",
    "id": 2
}, {
    "visible": "false",
    "id": 3
}];

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    一种选择是在array1 上使用map,在array2 上使用includes。在 map 内部,创建原始对象的副本,以便 array1 中的原始对象不会发生变异。

    var array1 = [{
      "visible": "true",
      "id": 0
    }, {
      "visible": "true",
      "id": 1
    }, {
      "visible": "true",
      "id": 2
    }, {
      "visible": "true",
      "id": 3
    }];
    
    var array2 = [0, 2];
    
    var array3 = array1.map(i => {
      var dc = JSON.parse(JSON.stringify(i));
      dc.visible = array2.includes(i.id).toString();
      return dc;
    });
    
    
    console.log(array3);
    console.log(array1);

    【讨论】:

      【解决方案2】:

      您可以将 array2 转换为 Set 以获得恒定的查找时间:

      function hide(array1, array2) {
          const indexes = new Set(array2);
          return array1.map(o => !indexes.has(o.id) ? ({...o, visible: "false" }) : o);
      }
      
      var array1 = [{
        "visible": "true",
        "id": 0
      }, {
        "visible": "true",
        "id": 1
      }, {
        "visible": "true",
        "id": 2
      }, {
        "visible": "true",
        "id": 3
      }];
      
      console.log(hide(array1, [0, 2]));

      这只会执行所要求的操作:将visible 转为"false",其中id 未列出。它不会做相反的事情,即当id 列出时,它不会将visible 变为"true":它只会复制原始设置。

      如果也发生相反的情况,则 visible 的原始值不再起作用:

      function hide(array1, array2) {
          const indexes = new Set(array2);
          return array1.map(o => ({...o, visible: indexes.has(o.id)+"" }));
      }
      
      var array1 = [{
        "visible": "true",
        "id": 0
      }, {
        "visible": "true",
        "id": 1
      }, {
        "visible": "true",
        "id": 2
      }, {
        "visible": "true",
        "id": 3
      }];
      
      console.log(hide(array1, [0, 2]));

      请注意,如果 visible 是布尔值而不是字符串(falsetrue 而不是 "false""true")会更有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 2021-03-13
        • 2017-11-22
        • 2018-08-23
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多