2017-07-25 59 views
1

我的数据的结构是这样的:删除对象的键在嵌套阵列高效方式

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'} 
       }, 
       ... 
       ] 
    } 
} 

在数据,我需要删除从所有数组元素的所有t键的所有模式(desktopmobileprint )。

什么是最有效的方法来做到这一点?这些模式数组可能会变得很大。

我已经尝试过这样的:

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,所以它没有工作。有更好的建议吗?

+0

[我不能重现该问题](https://jsfiddle.net/cs87jd7f/)..? 't's被删除... – Teemu

+0

谢谢@Kinduser我在我的应用程序中看到这个问题,因为我传递的状态是在REDX中操纵的。它必须与不变性问题相关。这个'obj'是从graphql调用返回的。似乎我将不得不深入深入。或复制我不想做的对象。 –

+1

您应该了解关于不变性要求的信息。 –

回答

1

我希望这不是吹起来开门,但你可以尝试reduce的形式给出。不变性要求得到满足。

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);

+0

只适用于每个阵列上只有一个元素。测试:https://jsfiddle.net/rpd9pzmt/ – Pedro

+0

@PedroCorso啊,是的,确实如此。错过单个阵列后的*三个点*固定! –

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);

0

不操作,因为你删除输出对象没有从Object对象

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)

1

不知道如果我在这儿有帮助的,但将数据(不包含t属性)复制到新对象似乎要快于delete方法:https://jsperf.com/removing-object-props

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

+0

http://jsben.ch/hLSXE非常有趣的发现! –

+0

非常有趣,看到删除是如此缓慢。 –

+0

测试现在已更正。 Reduce方法实际上几乎和删除一样慢。 – Pedro