通过对象属性从数组中删除对象

新手上路,请多包涵
var listToDelete = ['abc', 'efg'];

var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
                      {id:'efg',name:'em'}, // delete me
                      {id:'hij',name:'ge'}] // all that should remain

如何通过匹配对象属性从数组中删除对象?

请只使用本机 JavaScript。

我在使用拼接时遇到问题,因为每次删除长度都会减少。

在原始索引上使用克隆和拼接仍然会给您带来长度减少的问题。

原文由 Dan Kanze 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 692
2 个回答

我假设你使用了这样的 splice

 for (var i = 0; i < arrayOfObjects.length; i++) {
 var obj = arrayOfObjects[i];

 if (listToDelete.indexOf(obj.id) !== -1) {
 arrayOfObjects.splice(i, 1);
 }
 }

修复该错误所需要做的就是在下一次减少 i ,然后(并且向后循环也是一种选择):

 for (var i = 0; i < arrayOfObjects.length; i++) {
 var obj = arrayOfObjects[i];

 if (listToDelete.indexOf(obj.id) !== -1) {
 arrayOfObjects.splice(i, 1);
 i--;
 }
 }

为避免线性时间删除,您可以编写要 保留 在数组上的数组元素:

 var end = 0;

 for (var i = 0; i < arrayOfObjects.length; i++) {
 var obj = arrayOfObjects[i];

 if (listToDelete.indexOf(obj.id) === -1) {
 arrayOfObjects[end++] = obj;
 }
 }

 arrayOfObjects.length = end;

为了避免现代运行时中的线性时间查找,您可以使用哈希集:

 const setToDelete = new Set(listToDelete);
 let end = 0;

 for (let i = 0; i < arrayOfObjects.length; i++) {
 const obj = arrayOfObjects[i];

 if (setToDelete.has(obj.id)) {
 arrayOfObjects[end++] = obj;
 }
 }

 arrayOfObjects.length = end;

它可以包含在一个不错的功能中:

 const filterInPlace = (array, predicate) => {
 let end = 0;

 for (let i = 0; i < array.length; i++) {
 const obj = array[i];

 if (predicate(obj)) {
 array[end++] = obj;
 }
 }

 array.length = end;
 };

 const toDelete = new Set(['abc', 'efg']);

 const arrayOfObjects = [{id: 'abc', name: 'oh'},
 {id: 'efg', name: 'em'},
 {id: 'hij', name: 'ge'}];

 filterInPlace(arrayOfObjects, obj => !toDelete.has(obj.id));
 console.log(arrayOfObjects);

如果您不需要就地执行它,那就是 Array#filter

 const toDelete = new Set(['abc', 'efg']);
 const newArray = arrayOfObjects.filter(obj => !toDelete.has(obj.id));

原文由 Ry- 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以通过其属性之一删除项目,而无需使用任何第三方库,如下所示:

 var removeIndex = array.map(item => item.id).indexOf("abc");

~removeIndex && array.splice(removeIndex, 1);

原文由 parliament 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题