Xar*_*ari 4 javascript arrays object lastindexof ecmascript-6
我正在寻找一种方法来从数组中的一个点找到 Javascript 中对象的最后一个索引。例如:
array.lastIndexOf(object.key, start);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我还没有找到解决这个问题的好方法。我可以从“开始”点拼接数组,反转它,然后在切片数组中搜索键值,但这对我来说似乎是一个低效的解决方案。
编辑:
为了更详细地说明问题,我发布了我最终用来解决问题的代码。本质上; 我所做的是使用 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;
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*wik 12
就个人而言,我不会选择任何一种解决方案。原因如下:
最后索引:
问题在于在搜索数组时比较元素。它确实使用严格相等比较元素。因此,比较对象总是会失败,除非它们是相同的。在 OP 情况下,它们是不同的。
切片和反向单行@adeneo
给定一个包含三个元素的数组,[{key: A},{key: B},{key: C}]
查找 的最后一个索引key = D
将为您提供一个索引3
。这是错误的,因为最后一个索引应该是-1
(未找到)
循环遍历数组
虽然这不一定是错误的,但遍历整个数组来查找元素并不是最简洁的方法。是的,这是有效的,但可读性会受到影响。如果要我选一个,我可能会选这个。如果可读性/简单性是您的朋友,那么下面是另一种解决方案。
一个简单的解决方案
我们可以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
Run Code Online (Sandbox Code Playgroud)
快速解决方案
简单的向后查找(尽可能简洁和快速)。请注意-1
返回而不是 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
Run Code Online (Sandbox Code Playgroud)