gpt4 book ai didi

javascript - 为 Javascript 数组排序注入(inject)对象而不是函数

转载 作者:行者123 更新时间:2023-11-30 08:56:38 25 4
gpt4 key购买 nike

我正在尝试对 javascipt 中的对象数组进行排序。排序顺序本身取决于两个因素:对象的属性和单个外部变量的值。我知道我可以使用 array.sort(sortFunction) 来注入(inject)自定义函数,但我需要根据外部变量(在排序期间固定)使用不同的函数。

我将排序减少到显示问题的最小测试用例并尝试注入(inject)“降序/升序”参数,尽管真正的问题要复杂得多。我知道我可以 reverse() 结果,但这不是问题。

代码如下:

var ar = [ 10, 3, 5, 17 ];
var ns = new nsort();
ar.sort(ns.sort);
console.log(ar);

function nsort()
{
this.desc = true;
this.sort = function(a,b) {
console.log(this.desc);
if (this.desc)
return b-a;
else
return a-b;
}
}

这是输出(使用 Node.js)

undefined
undefined
undefined
undefined
[ 3, 5, 10, 17 ]

看起来数组排序代码在排序时将函数提取到父对象之外。

知道为什么会发生这种情况吗?正确的做法是什么?

更新:我确实找到了让它工作的方法:

var ar = [ 10, 3, 5, 17 ];
var ns = new nsort(true);
ar.sort(ns.sort);
console.log(ar);

function nsort(desc)
{
this.sort = function(a,b) {
if (desc)
return b-a;
else
return a-b;
}
}

这是个好主意吗?或者有更好的东西吗?

最佳答案

您的 ns.sort 正在丢失其调用上下文。换句话说,一旦将它传递给 .sort(),它就不再与 ns 对象有任何联系。

您可以让函数直接引用对象,方法是让构造函数中的变量指向它,并让排序函数引用该变量。

function nsort()
{
this.desc = true;
var self = this;
this.sort = function(a,b) {
console.log(self.desc);
if (self.desc)
return b-a;
else
return a-b;
}
}

或者,如果您处于像 NodeJS 这样的现代环境中,则可以使用 Function.prototype.bind() 将调用上下文值永久附加到函数。

function nsort()
{
this.desc = true;
this.sort = function(a,b) {
console.log(this.desc);
if (this.desc)
return b-a;
else
return a-b;
}.bind(this);
}

关于javascript - 为 Javascript 数组排序注入(inject)对象而不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13103895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com