繁体   English   中英

JS数组与数组对象的交集

[英]JS intersection of array and object of arrays

我想从我的对象中删除一些项目:

clientData : {
1111 : [
  {ID : 112, name : 'John',age : 23},
  {ID : 113, name : 'Doe',age : 21},
  {ID : 114, name : 'Stan',age : 24},
],

2222 : [
  {ID : 222, name : 'Sara',age : 15},
  {ID : 223, name : 'Wiliams',age : 61},
  {ID : 224, name : 'Alan',age : 45},
],

}

我要删除的数据存储在 Id 数组中,如下所示

[112,223,114]

所以输出应该是这样的

clientData : {
1111 : [
  {ID : 113, name : 'Doe',age : 21},
],
2222 : [
  {ID : 222, name : 'Sara',age : 15},
  {ID : 224, name : 'Alan',age : 45},
],
}

任何帮助请如何实现这一目标? 我真的不知道该怎么做,也没有在互联网上找到任何解决方案。

循环遍历每个对象属性并根据删除 ID 过滤数组。

let deleteIds = [112,223,114];

for (const data in clientData) {
  clientData[data] = clientData[data].filter(list=>!deleteIds.includes(list.ID));
}

console.log(clientData) // prints out your object

我假设您要过滤掉原始对象。 因此,您可以通过使用Array.forEach()方法和Array.splice () 来简单地实现它。

现场演示

 const clientData = { 1111 : [ {ID : 112, name : 'John',age : 23}, {ID : 113, name : 'Doe',age : 21}, {ID : 114, name : 'Stan',age : 24}, ], 2222 : [ {ID : 222, name : 'Sara',age : 15}, {ID : 223, name : 'Wiliams',age : 61}, {ID : 224, name : 'Alan',age : 45}, ] }; const invalidValues = [112, 223, 114]; Object.keys(clientData).forEach(key => { clientData[key].forEach((obj, index) => { if (invalidValues.includes(obj.ID)) { clientData[key].splice(index, 1); } }) }); console.log(clientData);

您可以使用Array.reduce()Array.filter()从客户端数组中删除项目。

我建议创建一个Set来包含要删除的 id。 这将使查找比使用数组更有效(使用Set.has

 const clientData = { 1111 : [ {ID : 112, name : 'John',age : 23}, {ID : 113, name : 'Doe',age : 21}, {ID : 114, name : 'Stan',age : 24}, ], 2222 : [ {ID : 222, name : 'Sara',age : 15}, {ID : 223, name : 'Wiliams',age : 61}, {ID : 224, name : 'Alan',age : 45}, ], } const idsToDelete = new Set([112,223,114]); const result = Object.keys(clientData).reduce((acc, key) => { acc[key] = clientData[key].filter(({ID}) => !idsToDelete.has(ID)); return acc; }, {}); console.log('Result:', result)
 .as-console-wrapper { max-height: 100% !important; }

您可以使用 for....in 循环循环您的 clientData 对象。

 let clientData = { 1111 : [ {ID : 112, name : 'John',age : 23}, {ID : 113, name : 'Doe',age : 21}, {ID : 114, name : 'Stan',age : 24}, ], 2222 : [ {ID : 222, name : 'Sara',age : 15}, {ID : 223, name : 'Wiliams',age : 61}, {ID : 224, name : 'Alan',age : 45}, ], }; const dataToDelete = [112, 223, 114]; for (const key in clientData) { clientData[key].forEach((data,index) =>{ if (dataToDelete.includes(data.ID)){ clientData[key].splice(index,1) } }) } console.log(clientData);

这是一种简单的方法。

 const deleteIds = [112,223,114]; const clientData = { 1111: [{ ID: 112, name: 'John', age: 23 }, { ID: 113, name: 'Doe', age: 21 }, { ID: 114, name: 'Stan', age: 24 } ], 2222: [{ ID: 222, name: 'Sara', age: 15 }, { ID: 223, name: 'Wiliams', age: 61 }, { ID: 224, name: 'Alan', age: 45 } ] }; for (let key in clientData) { clientData[key] = clientData[key].filter( user => !deleteIds.includes(user.ID) ); } console.log(clientData);

解决此类问题的关键是将其分解为更小的任务。 例如, clientData[1111]是一个您想要从中删除某些内容的数组,因此您可以去谷歌搜索“如何在 javascript 中从数组中删除一个项目”并学习如何单独执行此操作。 然后回来看看这个问题是否更有意义,然后决定接下来要学习什么子任务。

因为您在一个对象中有两个数组,所以它看起来更复杂,但唯一增加的复杂性是弄清楚如何循环对象中的值(在这种情况下为数组),这是您可以了解的另一个子任务隔离中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM