使用 JavaScript 从数组中删除对象

IT技术 javascript arrays
2021-02-05 02:10:31

如何从数组中删除对象?我希望KristiansomeArray. 例如:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

我想实现:

someArray = [{name:"John", lines:"1,19,26,96"}];
6个回答

您可以使用多种方法从数组中删除项目:

//1
someArray.shift(); // first element removed
//2
someArray = someArray.slice(1); // first element removed
//3
someArray.splice(0, 1); // first element removed
//4
someArray.pop(); // last element removed
//5
someArray = someArray.slice(0, someArray.length - 1); // last element removed
//6
someArray.length = someArray.length - 1; // last element removed

如果要删除 position 处的元素x,请使用:

someArray.splice(x, 1);

或者

someArray = someArray.slice(0, x).concat(someArray.slice(-x));

回复@chill182的评论:你可以使用Array.filterArray.splice结合Array.findIndex(见MDN从数组中删除一个或多个元素,例如

// non destructive filter > noJohn = John removed, but someArray will not change
let someArray = getArray();
let noJohn = someArray.filter( el => el.name !== "John" ); 
log(`let noJohn = someArray.filter( el => el.name !== "John")`,
  `non destructive filter [noJohn] =`, format(noJohn));
log(`**someArray.length ${someArray.length}`);

// destructive filter/reassign John removed > someArray2 =
let someArray2 = getArray();
someArray2 = someArray2.filter( el => el.name !== "John" );
log("", 
  `someArray2 = someArray2.filter( el => el.name !== "John" )`,
  `destructive filter/reassign John removed [someArray2] =`, 
  format(someArray2));
log(`**someArray2.length after filter ${someArray2.length}`);

// destructive splice /w findIndex Brian remains > someArray3 =
let someArray3 = getArray();
someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1);
someArray3.splice(someArray3.findIndex(v => v.name === "John"), 1);
log("",
  `someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1),`,
  `destructive splice /w findIndex Brian remains [someArray3] =`, 
  format(someArray3));
log(`**someArray3.length after splice ${someArray3.length}`);

// if you're not sure about the contents of your array, 
// you should check the results of findIndex first
let someArray4 = getArray();
const indx = someArray4.findIndex(v => v.name === "Michael");
someArray4.splice(indx, indx >= 0 ? 1 : 0);
log("", `someArray4.splice(indx, indx >= 0 ? 1 : 0)`,
  `check findIndex result first [someArray4] = (nothing is removed)`,
  format(someArray4));
log(`**someArray4.length (should still be 3) ${someArray4.length}`);

// -- helpers -- 
function format(obj) {
  return JSON.stringify(obj, null, " ");
}

function log(...txt) {
  document.querySelector("pre").textContent += `${txt.join("\n")}\n`
}

function getArray() {
  return [ {name: "Kristian", lines: "2,5,10"},
           {name: "John", lines: "1,19,26,96"},
           {name: "Brian", lines: "3,9,62,36"} ];
}
<pre>
**Results**

</pre>

您应该检查findIndex在使用它之前的结果splice如果数组中没有与条件匹配的元素,findIndex则将返回-1并将其直接放入splice将导致对数组中最后一个元素的任意删除。
2021-03-18 02:10:31
@ chill182:这不是一个具体的答案,而是一个更笼统的答案。从中,您应该能够推断出删除元素的方法。如果要删除位置 x 的元素... 可能是删除第一个元素以外的元素的提示,对吗?
2021-03-19 02:10:31
splice 函数对我很有帮助,但您不应该重新分配 someArray。这将导致 someArray 包含已删除的项目,而不是包含已删除项目的结果数组。
2021-04-02 02:10:31
@Klemzy 你不是说索引吗?按value...?
2021-04-05 02:10:31
原始问题询问如何从数组中删除名称为 =“Kristian”的对象。您的回答假定它是数组中的第一项,但如果 Kristin 不在第一项中怎么办?那么你的答案不起作用。
2021-04-07 02:10:31

干净的解决方案是使用Array.filter

var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; }); 

这样做的问题是它在 IE < 9 上不起作用。但是,您可以包含来自 Javascript 库(例如underscore.js)的代码,该库为任何浏览器实现了这一点。

毫无疑问,它会起作用。但是如果您关心内存管理,它无论如何都会创建一个新对象。我不想让我挑剔,这在任何情况下都有效。但是如果由于某种原因您正在处理一个非常大的数组,您应该使用相同的对象处理删除元素。
2021-03-15 02:10:31
关于返回一个新数组的点,只是将解决方案更改为解决该someArray = someArray.filter(function(el) { return el.Name != "Kristian"; }); 问题,不是吗?
2021-03-23 02:10:31
@JochieNabuurs 这确实是一个新数组。但是,对象保持不变。您仍然可以修改每个对象的值,它会反映在原始数组的对象上。
2021-03-28 02:10:31
但是,这将删除找到的所有事件,而不仅仅是第一个
2021-03-30 02:10:31
它将返回一个新数组而不是修改原始数组。根据用例,这可能是也可能不是您想要的。
2021-04-02 02:10:31

我推荐使用 lodash.js 或Sugar.js来完成这样的常见任务:

// lodash.js
someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });

// sugar.js
someArray.remove(function(el) { return el.Name === "Kristian"; });

在大多数项目中,拥有一组由这些库提供的辅助方法非常有用。

在这里违章;建议为了从对象中删除项目的简单目的而包含整个库(js 完全支持开箱即用,如已接受的答案所示)是糟糕的形式。它给您的代码增加了不必要的重量和复杂性,除非您已经需要它来实现库提供的更强大的功能。
2021-03-25 02:10:31
如果你不想使用 underscore.js 或 Sugar.js,你可以这样做 someArray = someArray.filter(function(e) { return e.Name !== "Kristian"; });
2021-03-28 02:10:31
为了简单的操作,我永远不会推荐包含库
2021-03-30 02:10:31
我认为下划线的例子有点偏离。应该someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });
2021-04-03 02:10:31
我想要的另一件事是,数组中的每个对象都有单独的按钮。如果我想删除单击的数组按钮中的特定对象。怎么做 。我使用 angular js ng-repeat 来生成项目。你能帮助我吗
2021-04-06 02:10:31

这个怎么样?

$.each(someArray, function(i){
    if(someArray[i].name === 'Kristian') {
        someArray.splice(i,1);
        return false;
    }
});
请注意,此答案需要 jQuery
2021-03-12 02:10:31
这不是javascript。-1
2021-03-31 02:10:31
这不会导致错误,因为$.each()在循环之前缓存数组长度,所以如果你删除一个元素$.each()将运行超过(现在较短)数组的末尾。(所以然后someArray[i]undefined并且undefined.name会崩溃。)
2021-04-01 02:10:31
然后在拼接后添加一个'return false'。
2021-04-03 02:10:31

ES2015

let someArray = [
               {name:"Kristian", lines:"2,5,10"},
               {name:"John", lines:"1,19,26,96"},
               {name:"Kristian", lines:"2,58,160"},
               {name:"Felix", lines:"1,19,26,96"}
            ];

someArray = someArray.filter(person => person.name != 'John');

它将删除约翰

是的,这是一个很好的方法。虽然它也可以在 ES2015(ES6) 之前工作。过滤功能从 5.1(2011) 版本ecma-international.org/ecma-262/5.1/#sec-15.4.4.20开始可用
2021-03-13 02:10:31
男人......来自java,我很困惑这样一个基本的事情需要过滤一个列表......wtf。这是迄今为止我读到的对 OP 问题最准确的答案。
2021-03-16 02:10:31