如何在JavaScript数组中返回当前值之前的所有元素?

7

假设我有一个数组:

var myArr = new Array('alpha','beta','gamma','delta');

我希望您能够编写一个函数,返回给定项之前的所有项目数组:
function getAllBefore(current) {
    var myArr = new Array('alpha','beta','gamma','delta');
    var newArr = ???
    return newArr;
}

getAllBefore('beta'); // returns Array('alpha');
getAllBefore('delta'); // returns Array('alpha','beta','gamma');

如何快速获取它?我能否根据某个值拆分数组?我必须循环每一个并即时构建新的数组吗?你有什么建议?

如果我想要相反的,比如getAllAfter()怎么办?


3
使用 indexOf 方法获取第一个与所需匹配项相符的元素位置,然后使用 slice 方法从开头到该位置进行切片。 - Ian
1
使用.indexOf()查找匹配项,并使用.slice()复制数组的一部分。 - jfriend00
不需要使用切片,只需将长度设置为索引+1(只要修改原始内容可以)。 :-) 另外,Array.prototype.indexOf是ES5的,因此可能需要在旧浏览器上提供额外支持。 - RobG
5个回答

20
function getAllBefore(current) {
    var myArr = new Array('alpha','beta','gamma','delta');
    var i = myArr.indexOf(current);
    return i > -1 ? myArr.slice(0, i) : [];
}
获取指定项的索引。如果找到,从0到该索引使用 .slice() 方法。如果没有找到,则返回一个空数组(或其他你喜欢的默认值)。
请注意,在 IE8 及更早版本中不支持 .indexOf()(用于数组),但是您可以使用替代方案,或者可以使用简单的 for 循环来代替。

1
谢谢!我需要改变什么才能得到getAllAfter(current) - Ryan
1
@Ryan myArr.slice(i + 1) - Ian
1
在? return i > -1 ? myArr.slice(i+1) : myArr.slice(0); 之后的所有内容都是,如果找到该项,则从索引后面的第一个开始返回,否则如果未找到,则返回整个数组的副本(或者您想要的其他默认值;您可以使用 return i > -1 ? myArr.slice(i+1) : []; 来将其默认为一个空数组)。 - nnnnnn
在编程中,使用三元运算符可以获得额外的加分。我很少在JavaScript中看到它们,尽管有些人讨厌它们,但对于一个简单的二选一,我发现它更容易阅读。 - EmmyS
有一个缺失的要求:如果没有找到current,应该返回整个数组还是空数组?假设是后者,则最后一行可以是return myArr.slice(0, i < 0? 0 : i); - RobG
1
@RobG - 是的,那个要求没有明确说明,但我在我的先前评论和回答中已经涵盖了这些选项。我不太喜欢使用.slice(0, i<0 ? 0 : i),因为使用.slice()返回一个空数组似乎有点浪费。按照我的答案所示做起来更清晰,也可以轻松更改以返回nullundefined,如果要求发生变化... - nnnnnn

2

Javascript切割数组

// array.slice(start, end)
const FRUITS = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = FRUITS.slice(1, 3);
// citrus => [ 'Orange', 'Lemon' ]

// Negative values slice in the opposite direction
var fromTheEnd = FRUITS.slice(-3, -1);
// fromTheEnd => [ 'Lemon', 'Apple' ]

仅截取最后5个元素的数组

 arr.slice(Math.max(arr.length - 5, 0))

1

最近我需要为一个对象数组做类似的事情。我使用了以下方法:

const myArr = [
    { controlId: 1, value: 'alpha'},
    { controlId: 2, value: 'beta' },
    { controlId: 3, value: 'gamma' },
    { controlId: 4, value: 'delta'}
];

function getAllBefore(id) {
    const index = myArr.findIndex( ({ controlId }) => controlId === id);
    return myArr.filter((_, i) => i < index);
}

1

使用 indexOfslice

newArr = myArr.slice(0, myArr.indexOf(current));

2
返回-1的索引怎么样? - Pilgerstorfer Franz
@PilgerstorferFranz 不用担心,它只会返回一个空数组。 - McGarnagle
3
不,它会返回除最后一个元素以外的所有元素。 - Bergi

0
尝试像这样做
var index = myArr.indexOf('beta');
var before = myArray.slice(0, index);

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