有没有一种方法可以实现chain.push和.shift数组方法
Is there a way to method chain .push and .shift array methods?
这是我的代码:
var myArr = [1,2,3,4,5];
function queue(arr, item) {
return arr.push(item).shift();
}
我正在尝试创建一个函数队列,它以"数组"answers"项"作为参数。我需要
- 将项添加到数组的末尾
- 删除数组的第一个元素
- 返回已删除的元素
我的代码不起作用。你能帮我弄清楚吗?
只是不要链接方法调用:
function queue(arr, item) {
arr.push(item);
return arr.shift();
}
或者,如果你想要一个单一的语句,
function queue(arr, item) {
return arr.push(item), arr.shift();
}
或者,如果你足够疯狂,你可以将Array子类化,并添加一个可链接的推送:
class MyArray extends Array {
chainablePush(item) {
this.push(item);
return this;
}
}
var myArr = new MyArray(1,2,3);
myArr.chainablePush(4).shift(); // 1
myArr; // MyArray [2,3,4];
因为arr.push返回数组的长度,所以不能像那样连锁移位
只需进行
function queue(arr, item) {
arr.push(item);
return arr.shift();
}
绝对不变
推送
[1, 2].concat([3])
// [1,2,3]
移位
[1,2,3].filter((e, i, a) => i != 0)
// [2,3]
弹出
[1,2,3].filter((e, i, a) => i != a.length - 1)
// [1,2]
取消提升
[1,2,3].concat([0]).map((e, i, a) => i == 0 ? a[a.length - 1] : a[i-1])
// [0,1,2,3]
在map和filter中使用第二个param索引和第三个param数组使事情变得非常灵活。使用这种方法可以尝试更多。
另一种(更简单)方式,但有点鲁莽,并非一成不变
推送
Array.prototype.pushChain = function(item) {
this.push(item)
return this
}
[1,2,3].pushChain(4)
//[1,2,3,4]
这意味着你可以使用数组的原型,使用你想要链接的更简单的方法,但只需返回this
,你就很好了,但缺点是你可能会把依赖数组的其他代码搞砸,或者可能会覆盖你不想要的其他方法。
或
另一种方法是制作一个类似于so 的JavaScript ES6+类型的类
class ImmutableChainedArray {
constructor(arr) {
this._arr = Array.isArray(arr) ? arr : []
}
push(item) {
this._arr = this._arr.concat([item])
return this
}
pop() {
this._arr = this._arr
.filter((e, i, a) => i != a.length - 1)
return this
}
shift() {
this._arr = this._arr
.filter((e, i, a) => i != 0)
return this
}
unshift(item) {
this._arr = this._arr
.concat([item])
.map((e, i, a) => i == 0 ? a[a.length - 1] : a[i-1])
return this
}
// the rest of them are easy...
val() {
return this._arr
}
}
然后像一样使用
const ica = new ImmutableChainedArray([1])
ica.unshift(0).push(2).shift().pop().val()
// ends up with [1]
有一种使用concat
而不是推送的黑客攻击
function queue(arr, item) {
return arr.concat([item]).shift();
}
应该会得到你想要的结果。
实际上,所有的答案都是正确的,我只想在ES6
:中添加另一种方法
const Queue = (array, item) => { array.push(item); return array.splice(0,1); }
或
const Queue = (array, item) => { array.push(item); return array.shift(); }
您不应该使用concat
而不是push
,因为在您的情况下,您应该更改myArr
数组,因为它是一个队列。
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 递归使用 eval() 是检查程序执行的好方法吗?
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- toLocaleDateString和toLocaleString方法不尊重机器时区
- 有没有一种方法可以实现chain.push和.shift数组方法
- _.chain()中的方法参数
- 为什么Underscore.js chain()方法不懒惰