Array.push返回推送值?

时间:2014-04-29 03:25:28

标签: javascript arrays

为什么修改Array.push()以返回推送的对象而不是新数组的长度可能是一个坏主意有没有实质性的理由?

我不知道这是否已经提出或被问过; Google搜索仅返回了与Array.push()当前功能相关的大量问题。

以下是此功能的示例实现,请随时更正:

;(function() {
    var _push = Array.prototype.push;
    Array.prototype.push = function() {
        return this[_push.apply(this, arguments) - 1];
    }
}());

然后你就可以做到这样的事情:

var someArray = [],
    value = "hello world";

function someFunction(value, obj) {
    obj["someKey"] = value;
}

someFunction(value, someArray.push({}));

例如,someFunction修改传入的对象作为第二个参数。现在someArray的内容为[{"someKey": "hello world"}]

这种方法有什么缺点吗?

7 个答案:

答案 0 :(得分:6)

  

为什么修改Array.push()以返回推送的对象而不是新数组的长度可能是一个坏主意有没有实质性的理由?

当然有一个:其他代码期望Array::push的行为与规范中定义的一样,即返回新的长度。如果您重新定义内置函数以使其意外行为,其他开发人员将发现您的代码难以理解。

至少为方法选择一个不同的名称。

  

然后您就可以执行以下操作:someFunction(value, someArray.push({}));

呃,什么?是的,我的第二点已经罢工了: - )

但是,即使您没有使用push,也无法实现您想要做的事情。你应该表达的组合是"添加一个由一个键和一个值组成的对象到一个数组"。使用更具功能性的样式,让someFunction返回此对象,然后编写

var someArray = [],
    value = "hello world";

function someFunction(value, obj) {
    obj["someKey"] = value;
    return obj;
}

someArray.push(someFunction(value, {}));

答案 1 :(得分:5)

就像历史记录一样 - 有一个旧版本的JavaScript - JavaScript version 1.2 - 处理了许多不同的数组函数。

特别针对这个问题,Array.push 确实返回项目,数组的长度。

尽管如此,1.2已经使用了几十年了 - 但是一些非常古老的引用可能仍然会引用这种行为。

http://web.archive.org/web/20010408055419/developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm

答案 2 :(得分:3)

随着 ES6 的出现,建议以正确的方式扩展数组类,然后覆盖method()方法:

push

答案 3 :(得分:3)

See my detailed answer here

TLDR;
当您使用array.concat[]添加元素时,可以获取变异数组的返回值。

concat是一种"添加"或者"加入"两个阵列在一起。关于这个方法的一个很棒的事情是,它有一个返回值的结果数组,所以它可以被链接。

newArray = oldArray.concat[newItem];

这也允许您将功能链接在一起

updatedArray = oldArray.filter((item) => { item.id !== updatedItem.id).concat[updatedItem]};

item = {id: someID, value: someUpdatedValue}

需要注意的是,您需要将数组传递给concat
因此,请确保将您的价值放在"推动"在几个方括号内,你很高兴 这将为您提供push()

所需的功能

您可以使用+运算符来"添加"将两个数组放在一起,或者将数组作为参数传递给concat()

let arrayAB = arrayA + arrayB;
let arrayCD = concat(arrayC, arrayD);

请注意,通过使用concat方法,您可以利用"链接" concat之前和之后的命令。

答案 4 :(得分:2)

var arr = [];
var element = Math.random();
assert(element === arr[arr.push(element)-1]);

答案 5 :(得分:1)

方法 push()返回最后添加的元素,这在创建短函数/缩减程序时非常不便。另外, push()-在JS中是相当古老的东西。另一方面,我们有spread operator [...] ,它可以is faster并执行您需要的操作:它精确地返回一个数组。

// to concat arrays
const a = [1,2,3];
const b = [...a, 4, 5];
console.log(b) // [1, 2, 3, 4, 5];

// to concat and get a length
const arrA = [1,2,3,4,5];
const arrB = [6,7,8];
console.log([0, ...arrA, ...arrB, 9].length); // 10

// to reduce
const arr = ["red", "green", "blue"];
const liArr = arr.reduce( (acc,cur) => [...acc, `<li style='color:${cur}'>${cur}</li>`],[]);
console.log(liArr);
  //[ "<li style='color:red'>red</li>", 
  //"<li style='color:green'>green</li>", 
  //"<li style='color:blue'>blue</li>" ]

答案 6 :(得分:0)

如何使用 someArray[someArray.length]={} 而不是 someArray.push({})?赋值的值就是被赋值的值。

var someArray = [],
    value = "hello world";

function someFunction(value, obj) {
    obj["someKey"] = value;
}

someFunction(value, someArray[someArray.length]={});

console.log(someArray)