开发者问题收集

当数组元素是对象时 indexOf() (javascript)

2014-11-04
4124

例如,一个名为 arrayElements 的数组类型变量包含:
[{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}]

除了使用循环之外,如何获取 arrayElements 变量中 id === 3 (第 3 个元素)的数组元素的位置?

谢谢。

3个回答
const arrayElements = [
  { id: 1, value: 5 },
  { id: 2, value: 6 },
  { id: 3, value: 7 },
  { id: 4, value: 8 }
]

console.log(arrayElements.findIndex((item) => item.id === 3))
Juliano Costa
2022-06-21

您必须在某一点循环。但您可以将其抽象化,使其看起来好像没有循环

function indexOfCallback(arr, callback, startIndex) {
    if (typeof startIndex == 'undefined') {
        startIndex = 0;
    }
    for(var i=startIndex; i < arr.length; i ++) {
        if (callback(arr[i])) {
            return i;
        }
    }
    return -1;
}

var array = [{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}];
// Search on id === 3
console.log(indexOfCallback(array, function(obj){
    return obj.id === 3;
}));
// Search on value === 6
console.log(indexOfCallback(array, function(obj){
    return obj.value === 6;
}));

正如 Anthony 所提到的,这是针对 ECMAScript 6 提出的。以下是更完整的 polyfill https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

if (!Array.prototype.findIndex) {
  Array.prototype.findIndex = function(predicate) {
    if (this == null) {
      throw new TypeError('Array.prototype.find called on null or undefined');
    }
    if (typeof predicate !== 'function') {
      throw new TypeError('predicate must be a function');
    }
    var list = Object(this);
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    var value;

    for (var i = 0; i < length; i++) {
      value = list[i];
      if (predicate.call(thisArg, value, i, list)) {
        return i;
      }
    }
    return -1;
  };
}
console.log(array.findIndex(function(obj){
    return obj.id === 3;
}));
Ruan Mendes
2014-11-04
arrayElements.map(o => o.id).indexOf(3);

注意:

  • 可能比循环慢,因为在搜索之前转换整个数组。但对于像 Javascript 这样的高级语言,你永远不知道。
  • 比循环可读性强得多。
  • 兼容 IE(与 2017 年的 findIndex 不同)。
7vujy0f0hy
2017-02-14