【发布时间】:2014-11-04 15:21:27
【问题描述】:
例如,名为 arrayElements 的数组类型变量包含:[{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}]。
除了使用循环之外,如何在arrayElements 变量中获取带有id === 3(第3 个元素)的数组元素的位置?
谢谢。
【问题讨论】:
标签: javascript arrays indexof
例如,名为 arrayElements 的数组类型变量包含:[{id:1, value:5},{id:2, value:6},{id:3, value:7},{id:4, value:8}]。
除了使用循环之外,如何在arrayElements 变量中获取带有id === 3(第3 个元素)的数组元素的位置?
谢谢。
【问题讨论】:
标签: javascript arrays indexof
你必须在某一点循环。但是您可以将其抽象为看起来没有循环
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;
}));
【讨论】:
findIndex(),这似乎是同一件事。现在肯定想为自己实现这样的东西,但也许在某些时候不需要。
arrayElements.map(o => o.id).indexOf(3);
注意事项:
【讨论】:
在这样的数组中,您不能通过 id 访问元素。因此,使用循环是您拥有的最佳解决方案。但是,根据您的用例,您也可以考虑使用对象而不是数组进行直接访问。
var container = { 1: {id:1, value:5}, 2: {id:2, value:6}, 3: {id:3, value:7} }
【讨论】:
您可以使用数组过滤器,但我认为使用循环可以获得更好的解决方案。
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);
【讨论】:
我为你写了一个函数,你可以使用它来完成工作,但它使用了一个循环:
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));
【讨论】:
indexOf 之类的东西,它允许您通过指定要查找的内容作为参数来搜索数组,但在这种情况下,您不能只传递一个类似的对象,因为它们不会通过相等测试。解决方案是让调用者将相等函数实现为回调。再次,请参阅我的答案。