我在访谈中有问题,如何在javascript 中找到数组的中间元素而不使用长度方法和循环。从我的观点来看,我们可以找到middle
元素但没有循环,我们无法找到。
我尝试了但是我没有得到正确的答案。我得到了4
,但预计是3
var arr =[1,2,3,4,5];
function middleElement(arr){
var i=0,
j=i+2;
while(arr[j] !=null){
i++;
j=i+2;
}
return arr[i]
}
middleElement(arr);
答案 0 :(得分:2)
如果数组值唯一,则可以反转数组。并将其与原始阵列进行比较。匹配的地方是中心。
var arr = [1, 2, 3, 4, 5];
var middle = [...arr].reverse().reduce((c, v, i) => {
if (v === arr[i]) c = v;
return c;
}, null);
console.log(middle);
如果你也不允许减少,你可以做递归
let arr = [1, 2, 3, 4, 5];
let findMiddle = (a, b, i) => {
if (a[i] !== b[i]) return findMiddle(a, b, i + 1);
return a[i];
}
let middle = findMiddle(arr, [...arr].reverse(), 0);
console.log(middle);
答案 1 :(得分:2)
你可以使用递归来实现:
var array = [1,2,8,4,5];
function middle(i) {
if (array[i] !== undefined) {
return middle(i+1);
} else {
return array[Math.floor(i / 2)];
}
}
console.log(middle(0));
答案 2 :(得分:2)
您可以通过弹出和移动数组来使用递归方法。然后获取最后一个值,该值不等于undefined
。
function getLeft(array, last) {
var value = array.shift();
return value === undefined ? last : getRight(array, value);
}
function getRight(array, last) {
var value = array.pop();
return value === undefined ? last : getLeft(array, value);
}
function getMiddle(array) {
return getRight(array.slice()); // take copy for destroying.
}
console.log(getMiddle([1, 2, 3, 4, 5]));

使用触发器进行弹出/移位方法的简洁方法。
function getMiddle(array) {
function takeItem(i) {
var value = a[['pop', 'shift'][i]]();
return 0 in a
? takeItem(1 - i)
: value;
}
var a = array.slice(); // take copy for destroying
return takeItem(0);
}
console.log(getMiddle([1, 2, 3, 4, 5]));

答案 3 :(得分:0)
当.length
为偶数时,以及.length
高于元素数的某些情况下,找不到中间元素是不可能的。例如,.length
的{{1}}为5,中间元素为1,但如果没有[,,1,,,]
属性,则无法确定。
话虽如此,这是一个接受答案的小改进版本:
.length
答案 4 :(得分:0)
var count =0;
function func(arr){
if(arr[count] != undefined) {
count++;
func();
}
}
func();
console.log(arr[count/2]);
答案 5 :(得分:0)
对此的快速解决方案是 middle = arr[parseInt((arr.length-1)/2)]
这将给出最接近的整数的中间数