删除嵌套数组中对象键的有效方法

时间:2017-07-25 11:28:24

标签: javascript arrays reactjs redux

我的数据结构如下:

obj = {
    _id: "sjkd9skj",
    data: {
      dektop: [
                { 
                   x: 2,
                   y: 3,
                   t: { key: 'aabbcc'}
                }, 
                ... 
              ],
      mobile: [
                { 
                   x: 4,
                   y: 3,
                   t: { key: 'ffff'}
                }, 
                ... 
              ],
      print: [
                { 
                   x: 7,
                   y: 5,
                   t: { key: 'ppp'}
                }, 
                ... 
              ]
    }
}

在数据中,我需要删除所有模式(tdesktopmobile)的所有数组元素中的所有print个键。

最有效的方法是什么?这些模式阵列可能变得非常大。

我试过这样的话:

obj.data.mobile.forEach((item)=>{
    delete item.t;
});
obj.data.desktop.forEach((item)=>{
    delete item.t;
});
obj.data.print.forEach((item)=>{
    delete item.t;
});

在这种情况下实际上没有操纵obj,所以它不起作用。还有更好的建议吗?

4 个答案:

答案 0 :(得分:1)

我希望它不会被打开,但你可以尝试reduce aproach。不可变性要求得以实现。



let obj = {_id:"sjkd9skj",data:{dektop:[{x:2,y:3,t:{key:'aabbcc'}},{x:2,y:3,t:{key:'aabbcc'}}],mobile:[{x:4,y:3,t:{key:'ffff'}},],print:[{x:7,y:5,t:{key:'ppp'}},]}};

const { _id } = obj;

let newObj = Object.keys(obj.data).reduce((s, a) => {
  obj.data[a].forEach((_, i) => {
    if (obj.data[a][i].t) {
      delete obj.data[a][i].t;
    }
  })
  s.data[a] = obj.data[a];
  return s;
}, { _id, data: {} });

console.log(newObj);




答案 1 :(得分:1)

不确定我是否在这里提供帮助,但将数据(没有t属性)复制到新对象似乎delete方法更快: https://jsperf.com/removing-object-props

编辑:我编辑了测试用例来修复Kind用户的代码。复制仍然更快。

答案 2 :(得分:0)

您可以使用array#forEach删除t密钥。



var obj = {
    _id: "sjkd9skj",
    data: {
      dektop: [
                { 
                   x: 2,
                   y: 3,
                   t: { key: 'aabbcc'}
                }
              ],
      mobile: [
                { 
                   x: 4,
                   y: 3,
                   t: { key: 'ffff'}
                } 
              ],
      print: [
                { 
                   x: 7,
                   y: 5,
                   t: { key: 'ppp'}
                }
              ]
    }
}

Object.keys(obj.data).forEach(o => {
  obj.data[o].forEach(p => delete p['t'])
});
console.log(obj);




答案 3 :(得分:0)

未被操纵,因为您正在从对象

删除输出对象而非对象



obj = {
  _id: "sjkd9skj",
  data: {
    dektop: [{
        x: 2,
        y: 3,
        t: {
          key: 'aabbcc'
        }
      },
    ],
    mobile: [{
        x: 4,
        y: 3,
        t: {
          key: 'ffff'
        }
      },
    ],
    print: [{
        x: 7,
        y: 5,
        t: {
          key: 'ppp'
        }
      },
    ]
  }
}

Object.keys(obj.data).forEach((item) => {
 delete obj.data[item][0].t;
});

console.log(obj.data)