从过滤器方法javascript返回索引值

als*_*o77 20 javascript angularjs

所以我的角度控制器中有一个对象数组,我想返回数组中字段索引的值,该数组与我的参数具有匹配的ID.数组中只有一个对象具有匹配的fieldId ..

$scope.indexOfField = function(fieldId) {
        return $scope.model.fieldData.filter(function(x) {
            if (x.Id === fieldId) {
                return // ???????
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

小智 46

.findIndex()方法返回满足函数给定条件的数组第一个元素的索引。如果函数false对数组的所有元素都返回,则结果为-1

请参阅此处的文档。

在我的示例中,x是每次迭代的一个项目,我对我的条件使用交叉函数。

const datas = [];
const fieldId = 5;
let index = datas.findIndex( x => x.Id === fieldId );
Run Code Online (Sandbox Code Playgroud)

  • 请添加一些关于代码中正在执行的操作的描述。 (2认同)

Rub*_*oga 16

您无法从filter方法返回索引.

The filter() method creates a new array with all elements that pass the test implemented by the provided function.

您可以使用 forEach

filter()方法创建一个新数组,其中包含所有传递由提供的函数实现的测试的元素.

$scope.indexOfField = function(fieldId) {
        var i;
        return $scope.model.fieldData.forEach(function(x, index) {
            if (x.Id === fieldId) {
                i = index;
            }
        });
        // use i
    }
Run Code Online (Sandbox Code Playgroud)

甚至更好地使用,for因为当你找到你的身份证时,你无法停止.

$scope.indexOfField = function(fieldId) {
        var fieldData = $scope.model.fieldData, 
            i = 0, ii = $scope.model.fieldData.length;
        for(i; i < ii; i++) if(fieldData[i].Id === fieldId) break;
        // use i
    }
Run Code Online (Sandbox Code Playgroud)

  • 这将迭代每个元素,而不是在找到正确的元素后停止。 (2认同)

Jiv*_*ngs 14

Array.prototype.filter文档:

使用三个参数调用回调:

  • 元素的价值
  • 元素的索引
  • 正在遍历的Array对象

但是,some如果数组中只有一个实例(因为它会在找到第一个匹配项时立即停止),您可能应该使用该函数,然后使用indexOf以下命令查找索引:

var field = $scope.model.fieldData.filter(function(x) {
    return x.Id === fieldId;
})[0];
var index = $scope.model.fieldData.indexOf(field);
Run Code Online (Sandbox Code Playgroud)

或者迭代数组,直到找到正确的元素:

var index;
$scope.model.fieldData.some(function(x, i) {
    if (x.Id === fieldId) return (index = i);
});
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 6

回调的第二个参数是索引。我不太清楚你想要你的函数做什么/返回什么,但如果你添加, indexafter function(x,这将使你能够访问该迭代的索引。

从你的函数名称来看,我认为你filter根本不想要:

$scope.indexOfField = function(fieldId) {
    var result = -1;
    $scope.model.fieldData.some(function(x, index) {
        if (x.Id === fieldId) {
            result = index;
            return true;
        }
    });
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Array#some从返回真值的第一次迭代开始停止,因此我们将在第一次找到匹配项时停止搜索。


小智 6

数组(查找多个索引)方法

[10, 7, 13, 15, 230].map((e,i) => e > 13 ? i : undefined).filter(x => x) 
      //returns [3, 4](*** RETURNS multiple indexes ***)
      //FILTER (is simply just REMOVING the UNDEFINED elements (which are FALSY and considered the same as FALSE)
Run Code Online (Sandbox Code Playgroud)

否则你会得到...

[10, 7, 13, 15, 230].map((e,i) => e > 13 ? i : undefined)  //returns [undefined, undefined, undefined, 3, 4]
Run Code Online (Sandbox Code Playgroud)

返回多个索引(代替findIndex方法)

[1, 1, 2, 2, 2, 3, 4, 5].map((e,i) => e === 2 ? i : undefined).filter(x => x) //returns [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

返回多个值(代替查找方法)

[5, 12, 8, 130, 44].map((e,i) => e > 13 ? e : undefined).filter(x => x) // returns [130, 44]
Run Code Online (Sandbox Code Playgroud)

  • 那索引= 0呢?它是虚假的,因此将被过滤。您需要`x =&gt; x!== undefined` (3认同)
  • filter(x =&gt; x !== undefined) 与索引 0 一起使用 (3认同)