indexOf()当array-elements是对象时(javascript)

时间:2014-11-04 15:21:27

标签: javascript arrays indexof

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

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

感谢。

6 个答案:

答案 0 :(得分:4)

你必须循环一点。但你可以抽象它看起来像你没有循环

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;
}));

如安东尼所述,这是针对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;
}));

答案 1 :(得分:1)

arrayElements.map(o => o.id).indexOf(3);

注意:

  • 可能比循环慢,因为之前转换整个数组 搜索。但是对于像Javascript这样的高级语言,你永远不会 知道。
  • 比循环更具可读性。
  • IE兼容(与2017年findIndex不同)。

答案 2 :(得分:0)

我为你编写了一个函数,你可以使用它来完成工作,但是它使用了一个循环:

var yourObjArray = [{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}];


function objArrayIndex(objArray){
  for(var i = 0; i < objArray.length; i++){
    if(objArray[i]['id'] == 3){
      return i;
    }
  }
  return -1;
}

console.log(objArrayIndex(yourObjArray));

答案 3 :(得分:0)

在这样的数组中,您无法通过id访问元素。因此,使用循环是您拥有的最佳解决方案。但是,根据您的使用情况,您还可以考虑使用对象而不是数组进行直接访问。

var container = { 1: {id:1, value:5}, 2: {id:2, value:6}, 3: {id:3, value:7} }

答案 4 :(得分:0)

您可以使用Array.forEach我猜

var fooArray = [{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}];
var foundIndex = -1;
fooArray.forEach(function(el, index){
    if(el.id==3) {
       foundIndex=index;
       return false;
     };
});

//foundIndex = 2

答案 5 :(得分:0)

您可以使用数组过滤器,但我认为您将使用循环获得更好的解决方案。

var array = [{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}];

var result = array.filter(condition);

function condition(value, index){
    if (value.id === 3) return index;
}

console.log(result);