我想打印出数组的最后'n'个元素

6
我正在编写一个JavaScript函数来获取数组的最后 'n' 个元素。如果数组有6个元素,用户提供4,则应返回最后4个元素。如果用户给出大于数组元素数量的“n”,则应返回所有元素。
问题是,如果数组有8个元素,我提供数字10,则结果为:undefined undefined 1 2 3 4 5 6 7 8 我想仅显示没有 "undefined" 的数字。
谢谢!
HTML代码
数组是:
1,2,3,4,5,6,7,8

        <br>
        x:
        <input type="number" id="x" value="2" >
        <br>
        <button onclick="elements()"> Get the elements </button>

        <p id="result"></p>

    <script src="ex10.js"></script>

JavaScript代码

 var Elements = new Array(1,2,3,4,5,6,7,8);

    function elements(){
    var x = document.getElementById("x").value;

    for(var i=Elements.length - x; i <=Elements.length-1; i++)
    {
    document.getElementById("result").innerHTML += Elements[i] + " ";
    }

}

1
请修复您的问题的格式 - Andreas
array.slice(0,-n) - Pierre Emmanuel Lallemant
你之前得到了 undefined 的值,是因为当你声明 var i = Elements.length - x 时,如果 x > Elements.length,那么 i 将会是负数。这样你就会访问数组下标小于 0 的元素(例如:Elements[-1]),导致出现 undefined 的值。 - Shidersz
7个回答

13
你可以使用从结尾开始的负数计数来提取slice。然后使用join方法将元素连接起来以进行格式化输出。
一些链接:
- Array#slice - Array#join

var array = [1, 2, 3, 4, 5, 6, 7, 8];

console.log(array.slice(-4).join(' '));


9
尝试使用带有负起始索引的.slice方法: .slice

var Elements = new Array(1,2,3,4,5,6,7,8);

var last4 = Elements.slice(-4)

console.log(last4)


1

还有其他方法可以实现您需要的功能,例如使用.slice().map()等。

如果您需要坚持使用for循环,则Math.min()可能会很方便:

const arr = [1, 2, 3, 4, 5, 6, 7, 8];
const elX = document.getElementById("x");
const elR = document.getElementById("result");

function elements() {
  const x = parseInt(elX.value, 10); // use parseInt with radix!
  const min = Math.min(arr.length, x);
  let html = "";
  for (var i = arr.length - min; i <= arr.length - 1; i++) {
    html += arr[i] + " ";
  }
  elR.innerHTML = html; // Insert into DOM only once!
}
x: <input type="number" id="x" value="2">
<button onclick="elements()">Get the last N elements</button>

<p id="result"></p>

这是使用 .slice().map() 的示例。

const arr = [1, 2, 3, 4, 5, 6, 7, 8];
const elX = document.getElementById("x");
const elR = document.getElementById("result");

function elements() {
  const x = parseInt(elX.value, 10);
  elR.innerHTML = arr.slice(-x).map(n => `Item:${n}`).join('<br>');
}
x: <input type="number" id="x" value="2">
<button onclick="elements()">Get the last N elements</button>

<p id="result"></p>


为什么会这样说呢?因为 Math.min() 可以派上用场。 - Andreas
我知道你为什么使用它。但TO显然是一个初学者,然而没有人试图解释他们的解决方案,或者来自TO代码的问题,或者... - Andreas
好的..我做了:(下面是答案)"你需要确保i在数组范围内。Elements.length-x需要等于或大于0。" - Victor Drouin
@Andreas 谢谢。通常当我完成总体概述后,我会自己检查我的答案,但很高兴有另一双眼睛 °.0 - Roko C. Buljan

1

const count = 5;
var Elements = new Array(1,2,3,4,5,6,7,8);
var result = Elements.slice(count > Elements.length ? 0 : Elements.length - count,Elements.length)
console.log(result)


1
如果x大于数组的大小,您可以将x重新赋值为数组的长度。现在,您最多会打印整个数组,至少打印x。
var x = document.getElementById("x").value;

if(x > Elements.length)  // add this
    x = Elements.length;

for(var i=Elements.length - x; i <=Elements.length-1; i++)
{
    document.getElementById("result").innerHTML += Elements[i] + " ";
}

1
const drivers = ['Sally', 'Bob', 'Freddy', 'Claudia'];

  function returnFirstTwoDrivers(drivers) {
  return drivers.slice(0,2) 
  }

    function returnLastTwoDrivers(drivers) {
    return drivers.slice(-2)
  }
  

document.getElementById("mocha").innerHTML = 'ARRAY 1: ' + returnFirstTwoDrivers(drivers) + '<br/>ARRAY 2: ' + returnLastTwoDrivers(drivers);

代码输出


1
当回答一个已有许多答案的老问题时,重要的是要解释一下你的答案与其他人的不同之处,否则你可能会被踩。例如,这个答案使用了 slice,就像其他几个现有的答案一样,包括最受欢迎的答案。此外,该答案使用了一个不同于原始问题的示例数组,这使得好奇者难以与其他答案进行比较。 - Heretic Monkey

0

你需要确保 i 在数组范围内。 Elements.length - x 必须等于或大于 0。

像其他人说的那样,你可以(应该?)使用 slice,但是既然你似乎正在练习 for 循环,那么最好坚持使用它。

var Elements = new Array(1,2,3,4,5,6,7,8);

function elements(){
    var x = document.getElementById("x").value;

    for(var i=Math.max(Elements.length - x, 0); i <=Elements.length-1; i++)
    {
        document.getElementById("result").innerHTML += Elements[i] + " ";
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接