【问题标题】:compare array of object with array of object in javascriptcompare array of object with array of object in javascript
【发布时间】:2022-12-01 18:59:51
【问题描述】:

compare array of object with array of keys, filter array of object with array keys.

Input:

let a = ['aa'];
let b = [{ aa: 1, bb: 2, c: 30 },{ aa: 2, bb: 3, c: 40}];

output:

b = [{bb: 2, c: 30 },{bb: 3, c: 40}];

original array should be mutate.

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    Much similiar to @SachilaRanawaka 's answer, but works without modifying the original b array:

    let a = ['aa'];
    let b = [{ aa: 1, bb: 2, c: 30 },{ aa: 2, bb: 3, c: 40}];
    
    function removeKey(obj, key) {
      let clone = Object.assign({}, obj); // <-- shallow clone
      if (key in clone) {
        delete clone[key];
      }
      return clone;
    }
    
    function removeKeys(keys, objs) {
      return objs.map(o => keys.reduce(removeKey, o));
    }
    
    console.log(removeKeys(a, b));

    【讨论】:

      【解决方案2】:

      You could take a destructuring with getting the rest approach.

      This approach does not mutate the original data.

      const
          unwanted = ['aa'],
          data = [{ aa: 1, bb: 2, c: 30 }, { aa: 2, bb: 3, c: 40 }],
          result = data.map(o => unwanted.reduce((q, k) => {
              const { [k]: _, ...r } = q;
              return r;
          }, o));
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        【解决方案3】:

        It can probably be solved with less lines of code, but this was the first i could think of.

        let keysToRemove = ['aa'];
        let array = [{ aa: 1, bb: 2, c: 30 },{ aa: 2, bb: 3, c: 40}];
        let result = array.map((item) => {
          let filtered = Object.keys(item)
            .filter((key) => !keysToRemove.includes(key))
            .reduce((obj, key) => {
              obj[key] = item[key];
              return obj;
            }, {});
          return filtered;
        });
        console.log(result);

        【讨论】:

          【解决方案4】:

          use the map operator and use delete to delete properties from the object

          let a = ['aa'];
          let b = [{ aa: 1, bb: 2, c: 30 },{ aa: 2, bb: 3, c: 40}];
          
          
          const result = b.map(item => {
          
              Object.keys(item).forEach(key => {
                 if(a.includes(key)){
                    delete item[key]
                 }
              })
              
              return item
            
          })
          
          console.log(result)

          【讨论】:

            猜你喜欢
            • 2022-12-06
            • 2022-12-01
            • 2022-01-25
            • 2022-12-01
            • 2022-11-20
            • 2020-10-10
            • 2022-12-01
            • 1970-01-01
            • 2022-12-26
            相关资源
            最近更新 更多