使用对象数组

时间:2017-09-22 14:38:55

标签: javascript arrays object ecmascript-6 lastindexof

我正在寻找一种从数组中的某个点查找Javascript中对象的最后一个索引的方法。例如:

array.lastIndexOf(object.key, start);

到目前为止,我还没有找到解决这个问题的好方法。我可以从“开始”点拼接数组,反转它,然后在切片数组中搜索键值,但这对我来说似乎是一个低效的解决方案。

编辑:

为了更详细地说明问题,我发布了最终用于解决问题的代码。实质上;我所做的是使用While循环遍历数组中的先前值。

getLastValue = (index) => {
  const arr = [
    {'d':'01-02-2017','v':'123'},
    {'d':'02-02-2017'},
    {'d':'04-02-2017'},
    {'d':'05-02-2017','v':'456'},
    ...
  ];

  let lastValue;

  while (arr[index] && !arr[index].v) {
    index--;
  }

  lastValue = arr[index];

  return lastValue;
}

6 个答案:

答案 0 :(得分:3)

我想你想要下面的东西:

var arr = [ { key: "a" }, { key: "b" }, { key: "c" }, { key: "e" }, { key: "e" }, { key: "f" } ];

console.log(lastIndexOf("e", 2));

function lastIndexOf(keyValue, start) {
    for (var i = arr.length - 1; i >= start; i--) {
        if (arr[i].key === keyValue) {
            return i;
        }
    }
    return null;
}

答案 1 :(得分:2)

使用ES2015和findIndex,您可以传递回调以查找对象密钥。

如果您复制数组并将其反转,您可以通过从总长度中减去该索引来找到最后一个(和1,因为数组基于零)

效率不高,但它只有一行,适用于正常大小的阵列,即不是一百万个指数

var idx = arr.length - 1 - arr.slice().reverse().findIndex( (o) => o.key == 'key' );



var arr = [{key : 'not'}, {key : 'not'}, {key : 'key'}, {key : 'not'}];

var idx = arr.length - 1 - arr.slice().reverse().findIndex( (o) => o.key == 'key' ); // 2

console.log(idx)




更有效的方法是向后迭代,直到找到您正在寻找的对象并打破循环



var arr = [{key: 'not'}, {key: 'not'}, {key: 'key'}, {key: 'not'}];

var idx = (function(key, i) {
  for (i; i--;) {
    if (Object.values(arr[i]).indexOf(key) !== -1) {
      return i;
      break;
    }
  }   return -1;
})('key', arr.length);

console.log(idx)




答案 2 :(得分:1)

您可以这样做:

  1. 反转数组:let newArr = arr.reverse()
  2. 使用findIndexnewArr.findIndex(obj => obj.d == "your String")

答案 3 :(得分:0)

只是尝试找到整个大规模的最后一个索引并将其与开始进行比较

let ind = array.lastIndexOf(object.key); 
if (ind > start) {return}

答案 4 :(得分:0)

就个人而言,我不会选择任何一种解决方案。这是原因:

LastIndexOf:

问题出在搜索数组时比较元素。它确实使用严格相等来比较元素。因此,比较对象将始终失败,除非它们相同。在OP中,它们是不同的。

切片和反向单层@adeneo

给出一个由三个元素[{key: A},{key: B},{key: C}]组成的数组,对key = D的最后一个索引的查找将为您提供3的索引。这是错误的,因为最后一个索引应该为-1(未找到)

遍历数组

虽然这不一定是错误的,但遍历整个数组以查找元素并不是最简洁的方法。 yes效率很高,但是可读性会受到影响。如果可读性/简单性是您的朋友,那么下面是又一个解决方案。


一个简单的解决方案

我们可以使lastIndexOf起作用,我们只需要使值具有可比性(严格等式一致)即可。或简单地说:我们需要将对象映射到单个属性,我们希望找到使用javascript的本机实现的最后一个索引。

const arr = [ { key: "a" }, { key: "b" }, { key: "c" }, { key: "e" }, { key: "e" }, { key: "f" } ];

arr.map(el => el.key).lastIndexOf("e"); //4
arr.map(el => el.key).lastIndexOf("d"); //-1

// Better:
const arrKeys = arr.map(el => el.key);
arrKeys.lastIndexOf("c"); //2
arrKeys.lastIndexOf("b"); //1

快速解决方案

简单的向后查找(尽可能简洁和快速)。请注意,返回-1而不是null / undefined。

const arr = [ { key: "a" }, { key: "b" }, { key: "c" }, { key: "e" }, { key: "e" }, { key: "f" } ];

const lastIndexOf = (array, key) => {
  for(const i = array.length - 1; i >= 0; i--){
    if(array[i].key === key)
      return i;
  }
  return -1;
};

lastIndexOf(arr, "e"); //4

答案 5 :(得分:0)

我使用了示例代码,如下所示:

//find last index in object array
const lastIndexOf = arr.reduce((acc,cur,idx)=>cur.key==xxx?idx:acc,-1)

//find last index of object in object array
const lastIndexOfObject = arr.reduce((acc,cur,idx)=>cur.key==xxx?cur:acc,undefined)