在对象数组中查找 lastIndexOf() 具有键的对象

Find the lastIndexOf() an object with a key in array of objects

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

array.lastIndexOf(object.key, start);

到目前为止,我还没有找到解决这个问题的好方法。我可以从 '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;
}

只需尝试在整个海量数据中找到最后一个索引并将其与开始进行比较

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

我想你想要像下面这样的东西:

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

使用 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)

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

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 return 而不是 null/undefined.

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

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

lastIndexOf(arr, "e"); //4
lastIndexOf(arr, "x"); //-1

你可以这样做:

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

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

//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)