【问题标题】:Passing argument to array.prototype.findIndex(callback[, thisArg])将参数传递给 array.prototype.findIndex(callback[, thisArg])
【发布时间】:2016-05-26 14:03:57
【问题描述】:

我在将参数传递给 javascript array.prototype.findIndex(callback[, thisArg]) API 时遇到问题。 javascript文档指定可以传递一个参数,但我没有运气。 这是API参考Array.prototype.findIndex()

我在 API 中看到了这种语法:

arr.findIndex(callback[, thisArg])

这是我当前的实现,但我不喜欢使用全局创建的变量实现它的方式,它不是易于测试的代码。

var vm = this; //angular context
//List of objects
vm.someList = [{storeId: "1", name:"Carmel", quantity:"25", orderNumber:"12345"},
		       {storeId: "2", name:"Chocolate", quantity:"25", orderNumber:"23456"},
		       {storeId: "3", name:"Vanilla", quantity:"25", orderNumber:"34567"},
		       {storeId: "4", name:"Cinnamon", quantity:"25", orderNumber:"45678"}];
		
//List of items marked with priority
vm.priorityList = [{storeId: "3", name:"Vanilla", quantity:"25", orderNumber:"34567", priority: "true"}];
		
//For loop finds index of criteria to perform operation on someList[i] element
for(var i =0; i < vm.priorityList.length; i++){
	//itemToFind created in global scope.
        vm.itemToFind = vm.priorityList[i];
	var index = vm.someList.findIndex(findPriorityIndex);
	//Don't worry about the operation being performed.
    console.log(index);
}

//callback fn used
function findPriorityIndex(element, index, array){
     return (element.storeId === vm.itemToFind.storeId
        && element.orderNumber ===vm.itemToFind.orderNumber);
}

我尝试使用以下语法在回调中传递要用作 thisArg 的参数,但都导致尝试失败。我也承认 API 提到参数将在回调中被引用为 this,并且我已经在回调函数中进行了这样的调整。

vm.someList.findIndex(findPriorityIndex[, vm.priorityList[i]]);
vm.someList.findIndex(findPriorityIndex(vm.priorityList[i]));
vm.someList.findIndex([findPriorityIndex, vm.priorityList[i]]);

如果有人能提供有关如何将参数传递给回调函数的任何信息,我将不胜感激。

【问题讨论】:

    标签: javascript arrays angularjs


    【解决方案1】:

    基本上你在回调中设置thisArg of findIndex,this

    for (var i = 0; i < vm.priorityList.length; i++) {
        index = vm.someList.findIndex(findPriorityIndex, vm.priorityList[i]);´
        //                                   set thisArg ^^^^^^^^^^^^^^^^^^
        console.log(index);
    }
    
    // callback fn used
    function findPriorityIndex(element, index, array) {
        return element.storeId === this.storeId && element.orderNumber === this.orderNumber;
        //        access this here ^^^^                                and ^^^^
    }
    

    【讨论】:

    • 谢谢你,这正是我正在寻找的答案。我想知道为什么 API 说语法是另一种方式?
    • 好吧,我很高兴你知道正确的语法。非常感谢!
    • @TerNovi 仅供参考,语法 arr.findIndex(callback[, thisArg]) 仅表示 thisArg 参数是可选的。 ;)
    • ES6 警告:确保你使用上面代码中的函数,因为const findPriorityIndex = (element, index, array) =&gt; { etc.. } 不起作用。在这种情况下,this 将设置为 Window。这让我绊倒了......
    【解决方案2】:

    简单来说,使用 this 来访问参数,如下所述

    const fruits = [{id:1,label:"apple"},{id:2,label: "banana"}, {id:3,label:"cantaloupe"}
                ];
    function checkIndex(element) {
    
        return element.label == this;
    }
    
    console.log(fruits.findIndex(checkIndex,'banana'));
    

    【讨论】:

    • 这是一个出色而简单的解决方案。您可以为 Angular 添加 this.toString() 。刚刚验证了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多