如何在不复制数组的情况下返回 Javascript 中的数组减去单个项目? [复制]

Posted

技术标签:

【中文标题】如何在不复制数组的情况下返回 Javascript 中的数组减去单个项目? [复制]【英文标题】:How do you return an array in Javascript minus a single item without copying the array? [duplicate] 【发布时间】:2012-11-03 04:17:39 【问题描述】:

可能重复:Remove item from array by value

我正在维护字符串列表,例如

var keyString = [];

keyString.push("anotherString");
keyString.push("yetAnotherString");
keyString.push("oneLastString");

我希望能够返回来自 keyString 的所有结果,减去我已经知道的值。

例如,如果我有 anotherString,那么我想返回数组中不是 anotherString 的所有内容。

显然这可以通过几种方式轻松完成,但我有一些限制。

我不希望解决方案使用任何循环,也不希望使用过多的内存,也不希望修改原始数组

这可能是不可能的,但我想我会把它扔在那里看看是否存在。

【问题讨论】:

您不想复制数组,也不想修改原始数据,但您希望最终得到原始数据的修改版本。这究竟是如何工作的? 这里有一些神奇的粉末可以让它消失。 这不是从数组中删除某些东西的远程副本。 在您更改问题以使其成为不可能的请求之前,它是完全重复的。 @user1689607:可能是 OP 的 other 帐户来补偿否决票... 【参考方案1】:

考虑到您的示例代码的一些可能性,但在函数内部(或return 没有意义)。这些示例假设您可以修改原始数组,因为您不想复制。

1.使用shift 删除第一个元素

function something() 
    someObject["keyString"] = [];
    someObject["keyString"].push("anotherString");
    someObject["keyString"].push("yetAnotherString");
    someObject["keyString"].push("oneLastString");
    someObject["keyString"].shift(); 
    return someObject;

2。使用pop 删除最后一个元素

function something() 
    someObject["keyString"] = [];
    someObject["keyString"].push("yetAnotherString");
    someObject["keyString"].push("oneLastString");
    someObject["keyString"].push("anotherString");
    someObject["keyString"].pop(); 
    return someObject;

3.使用splice去除中间元素

function something() 
    someObject["keyString"] = [];
    someObject["keyString"].push("yetAnotherString");
    someObject["keyString"].push("anotherString");
    someObject["keyString"].push("oneLastString");
    someObject["keyString"].splice(1,1); 
    return someObject;

【讨论】:

仅作记录,.splice.unshift 很可能是线性时间的,尽管可能使用本机代码实现。 (也就是说,如果这对 OP 很重要,它们可能在内部是“循环”。) 这些不起作用,因为我无法保证它是数组中的第一项或最后一项,并且 splice 会修改原始数组。 (我将对其进行编辑以将其作为限制) @user1500053 所以你不想修改原始数组,也不想复制?那我想没办法了。 @Pointy 抱歉问,OP 是什么意思。今天看了好几遍了,还没弄明白 我在想也许有某种方法可以返回一个数组,该数组是对原始数组中对象的引用。但我想,回想起来,数组只是对对象的引用,所以过滤器可能会起作用。【参考方案2】:

不是防弹的,但它有效:

var a = ["a", "b", "c", "d"];
a.splice( a.indexOf("c"), 1 );

console.log(a); // ["a", "b", "d"];

【讨论】:

【参考方案3】:

您可以使用filter(),但这也会返回一个新数组:

var newArray = keyString.filter( function( el ) 
  return el !== 'anotherString';
 );

【讨论】:

以上是关于如何在不复制数组的情况下返回 Javascript 中的数组减去单个项目? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不复制对象的情况下向 Python 公开返回 C++ 对象的函数?

如何在不更改原始数组的情况下更改函数中的数组? [复制]

如何在不使用 NumPy 复制的情况下展平多维数组的轴?

如何在不使用outerHTML的情况下在javascript中将标签作为文本? [复制]

如何在不替换 ES6/Javascript 中的整个属性的情况下深度复制对象 [重复]

如何在不创建新数组的情况下用另一个数组扩展现有 JavaScript 数组