【问题标题】:Quickly toggle a boolean property of objects in an array based on a list of attribute values根据属性值列表快速切换数组中对象的布尔属性
【发布时间】:2021-09-11 12:12:24
【问题描述】:

我有一个对象数组,例如:

[{type: 'marker', name: 'somename', id: '123abc321', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}, {type: 'marker', name: 'somename', id: '123abc322', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}, {type: 'marker', name: 'somename', id: '123abc323', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}]

数组中的最大对象数约为 7600

我正在努力寻找一种快速的方法,将其 id 包含在 id 值数组中的每个对象的“选定”属性从 true 翻转为 false,反之亦然:

['123abc322', '123abc323']

id 值的供应商数组可能包括所有对象 id,通常是 ~2000 个 id。

所以如果 object.id 字段在提供的数组中,我想将 object.selected 交换为 !object.selected

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript arrays filtering updating


    【解决方案1】:

    我建议将您的 ID 数组转换为 Set。然后,只需遍历您的数组,如果 Set 包含元素的 ID,则切换 selected 属性。

    请注意,此方法会修改数组中的对象。如果您不需要改变输入,您可以使用map

    改变输入:

    const arr = [{type: 'marker', name: 'somename', id: '123abc321', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}, {type: 'marker', name: 'somename', id: '123abc322', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}, {type: 'marker', name: 'somename', id: '123abc323', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}];
    
    const ids = new Set(['123abc322', '123abc323']);
    
    arr.forEach(el => {
      if (ids.has(el.id)) {
        el.selected = !el.selected;
      }
    });
    
    console.log(arr);

    不改变输入:

    const arr = [{type: 'marker', name: 'somename', id: '123abc321', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}, {type: 'marker', name: 'somename', id: '123abc322', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}, {type: 'marker', name: 'somename', id: '123abc323', lat: 123.00, lng: 32.00, educationRegion: 'someregion', seDistrict: 'sometype', sector: 'somesector', selected: false, shownOnMap: true, listed: false}];
    
    const ids = new Set(['123abc322', '123abc323']);
    
    const newArr = arr.map(el => {
      if (!ids.has(el.id)) return el;
    
      return {
        ...el,
        selected: !el.selected
      }
    });
    
    console.log(newArr);

    【讨论】:

    • 感谢您的回答,这两个选项都运行良好,但仍然没有性能提升。我仍在寻找大约 11 秒的时间来处理 270 项针对 7600 的完整数组。
    • 快速更新:原来延迟是组件渲染更新结果而不是更新本身。叹。再次感谢您的帮助。
    【解决方案2】:

    您可以使用一行代码完成所有操作,下面是一个代码示例:

    let array = [{
        type: "marker",
        name: "somename",
        id: "123abc321",
        lat: 123.0,
        lng: 32.0,
        educationRegion: "someregion",
        seDistrict: "sometype",
        sector: "somesector",
        selected: false,
        shownOnMap: true,
        listed: false,
      },
      {
        type: "marker",
        name: "somename",
        id: "123abc322",
        lat: 123.0,
        lng: 32.0,
        educationRegion: "someregion",
        seDistrict: "sometype",
        sector: "somesector",
        selected: false,
        shownOnMap: true,
        listed: false,
      },
      {
        type: "marker",
        name: "somename",
        id: "123abc323",
        lat: 123.0,
        lng: 32.0,
        educationRegion: "someregion",
        seDistrict: "sometype",
        sector: "somesector",
        selected: false,
        shownOnMap: true,
        listed: false,
      },
    ];
    
    let ids = ['123abc322', '123abc323'];
    
    // .filter() create a new array with all elements that pass the test implemented by the provided function.
    // .map() run a function for everyone of the remaining objects and flip the "selected" value.
    
    array.filter(x => ids.includes(x.id)).map(x => x.selected = !x.selected);
    console.log(array);

    希望这就是你要找的东西。

    【讨论】:

    • 感谢您的回答,它完全有效,但不幸的是并没有给我任何性能提升。我仍在寻找大约 11 秒的时间来处理 270 项针对 7600 的完整数组。
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2014-09-12
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多