在javascript中的数组中查找多个最小值的索引
Posted
技术标签:
【中文标题】在javascript中的数组中查找多个最小值的索引【英文标题】:Find indexes of multiple minimum in an array in javascript 【发布时间】:2015-12-15 21:39:01 【问题描述】:我想找到一个数组最小值的索引。
例如
var array = [1,2,3,4,1,7,8,9,1];
var min = Math.min.apply( Math, array )
var key = array.indexOf(min);
问题是 Math.min.apply 只返回第一个索引
min = 1 和 key = 0
我想做的就是回归
min = 1 and key = [0,4,8];
可以用 Math.min.apply 做到吗?
【问题讨论】:
【参考方案1】:var array = [1,2,3,4,1,7,8,9,1];
var min = Math.min.apply( Math, array )
var arrayWithIndex = array.map(function(element, index)
return element + "-" + index;
);
var minValues = arrayWithIndex.filter(function(element)
return Number(element.split('-')[0]) === min;
);
var keys = minValues.map(function(element)
return Number(element.split('-')[1]);
);
我的算法将原始数组映射为包含一个包含数字和索引的新数组。然后我在该数组中过滤元素,其中数字等于 min,然后再次映射以找到索引。
你也可以链接这些方法
return array.map(function(element, index)
return element + "-" + index;
)
.filter(function(element)
return Number(element.split('-')[0]) === min;
).
.filter(function(element)
return Number(element.split('-')[1]);
);
【讨论】:
【参考方案2】:Array.prototype.reduce
应该可以完成这项工作。
var array = [1, 2, 3, 4, 1, 7, 8, 9, 1];
function getMinKeys(array)
var min = Math.min.apply(Math, array);
return array.reduce(function (r, a, i)
a === min && r.push(i);
return r;
, []);
document.write('<pre>' + JSON.stringify(getMinKeys(array), 0, 4) + '</pre>');
【讨论】:
为什么是a === min && r.push(i);
?它甚至会带来性能提升吗?
与什么比较?写a === min && r.push(i);
比写if (a === min) r.push(i);
短。【参考方案3】:
var array = [1,2,3,4,1,7,8,9,1];
function findMinimumIndexes(array)
var min = Math.min.apply(Math, array);
var indexes = [];
array.forEach(function(item, idx, arr)
if (item === min)
indexes.push(idx);
);
return indexes;
console.log(findMinimumIndexes(array));
该函数声明变量indexes
并为其分配一个空数组,然后使用forEach
调用填充该变量,其中元素的索引值与min
匹配。
请注意,这仅适用于原始值,因为它使用===
来检查等价性。
要使其在与您正在寻找的“深度相等”的数组或对象上工作,您需要更严格的实现。
【讨论】:
以上是关于在javascript中的数组中查找多个最小值的索引的主要内容,如果未能解决你的问题,请参考以下文章