我想在javascript中获取给定系列的逆序数。如果我有以下系列:
[1,2,2,2,5,5,7,8,8,10]
然后,如果输入为数字8
,则输出应为2
,因为:
1 = 10
2 = 7
2 = 7
2 = 7
5 = 5
5 = 5
7 = 4
[8 = 2]
[8 = 2]
10 = 1
//--> [1 , 2,3,4, 5,6, 7, 8,9, 10]
--> [1 , 2,2,2, 5,5, 7, 8,8, 10]
[10, 7,7,7, 5,5, 4, 2,2, 1 ] <-- // ==> [1,2,2,4,5,5,7,7,7,10]
这是我到目前为止所做的:
function getReverseNumber(arr, num)
{
var newArr = new Array(arr.length);
var temp;
var counter = 1;
for(var i = arr.length; i > 0; i--)
{
if(temp === arr[i])
{
newArr[arr.length - i] = counter;
continue;
}
newArr[arr.length - i] = counter;
temp = arr[i];
counter++;
}
return newArr[num - 1];
}
但它没有按预期工作:
getReverseNumber(new Array(1,2,2,2,5,5,7,8,8,10), 8) // returns 5 not 2
我的功能出了什么问题?
答案 0 :(得分:1)
我认为你过度复杂了。只有在增加counter
时,您才会将newArr
增加一个,并且您将数字按照顺序排列,因此[1,2,2,3,4,4,5,5,5,6]
最终为[10,7,7,7,5,5,4,2,2,1]
而不是function getReverseNumber(arr, num) {
for (var i = 1; i <= arr.length; i++) {
if (arr[arr.length - i] == num) return i;
}
return -1; // not found
}
。
无需计算所有这些数字并保留在数组中。只需从1开始循环,然后计算数组中的哪个位置。找到值时返回索引:
{{1}}
答案 1 :(得分:1)
fiddle享受
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
"use strict";
if (this === void 0 || this === null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (len === 0) {
return -1;
}
var n = 0;
if (arguments.length > 0) {
n = Number(arguments[1]);
if (n !== n) { // shortcut for verifying if it's NaN
n = 0;
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
}
if (n >= len) {
return -1;
}
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++) {
if (k in t && t[k] === searchElement) {
return k;
}
}
return -1;
}
}
...
arr[ Math.Abs(arr.indexOf(num)-arr.length-1)]
抱歉格式化。我在打电话。
答案 2 :(得分:1)
适用于IE6甚至;)
function getReverseNumber(arr,num){
alert(arr[ arr.length + arr.indexOf(num) * -1 ]);
}
getReverseNumber(new Array(1,2,2,2,5,5,7,8,8,10), 8); // alerts 2
答案 3 :(得分:0)
a = [1,2,2,2,5,5,7,8,8,10]
n = a.lastIndexOf(8)
alert(a.length - n)
关于这些“IE8”评论 - 即使处理过时的浏览器,这也不是重新发明轮子的借口。使用标准的文档化JavaScript库函数,并在适当时包含兼容性/降级层。