获取数组中的第一个和最后一个元素 - JS

17
我尝试获取数组中的第一个和最后一个项,并将它们显示在一个对象中。我的做法是使用 first 和 last 函数,然后将第一个项分配为键,最后一个项分配为值。

我正在尝试获取数组中的第一个和最后一个项,并将它们显示在一个对象中。

我的做法是使用 first 和 last 函数,然后将第一个项分配为键,最后一个项分配为值。

var myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

function firstAndLast(array) {

var firstItem = myArray.first;
var lastItem = myArray.last;

 var objOutput = {
   firstItem : lastItem 
  };

}

var display = transformFirstAndLast(myArray);

console.log(display);

然而这个东西让我遇到了麻烦。它显示未定义。有任何想法是为什么吗?


myArray.first是什么意思?第一个项目是索引为0的项目。 - zerkms
2
寻找数组时,第一个对象应该是 myArray[0],最后一个对象应该是 myArray[myArray.length - 1] - user4616966
{Rodel: "Betus"} - user6925364
12个回答

23

我修改了您的代码:

var myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

function firstAndLast(array) {

var firstItem = myArray[0];
var lastItem = myArray[myArray.length-1];

 var objOutput = {
   first : firstItem,
   last : lastItem
  };

return objOutput;
}

var display = firstAndLast(myArray);

console.log(display);

更新:新的修改

var myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

function firstAndLast(array) {

var firstItem = myArray[0];
var lastItem = myArray[myArray.length-1];

var objOutput = {};
objOutput[firstItem]=lastItem

return objOutput;
}

var display = firstAndLast(myArray);

console.log(display);


1
如果期望的输出是{Rodel: "Betus"},正如OP代码中的{ firstItem : lastItem }所暗示的那样,那该怎么办呢? - nnnnnn
{Rodel: "Betus"} - user6925364
var objOutput = { firstItem: lastItem }; 不起作用。 - user6925364
@Ashraf - 如果只看那句话,那么只需要console.log(myArray)这行代码就可以了,因为myArray已经是对象类型。 - nnnnnn
@EmilS.Jørgensen 我同意,这个需求本身有点奇怪。 - Ashraf
显示剩余3条评论

16

截至2021年,您可以使用 Array.prototype.at()

let colors = ['red',  'green', 'blue']

let first = colors.at(0) // red
let last = colors.at(-1) // blue

要了解更多有关Array.prototype.at()的信息


15

使用ES6和解构:

const myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

const { 0: first, length, [length -1]: last } = myArray //getting first and last el from array
const obj = { first, last }

console.log(obj) // {  first: "Rodel",  last: "Betus" }

13

ES6

var objOutput = { [myArray[0]]: [...myArray].pop() }

var myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

var objOutput = { [myArray[0]]: [...myArray].pop() }

console.log(objOutput);


不冒犯,但这看起来比非ES6变体要糟糕得多 :) - Bataleon
6
这个答案的价值在于它简短并且与其他答案不同,因此给程序员提供了更多选择,并增加了他对潜在机会的认识。 - Kamil Kiełczewski
4
@Bataleon, "vote down" 的意思是“错误”,但这并不是一个错误的答案。如果您不喜欢某个答案,可以自由发表评论,但如果它真的很糟糕,它将得不到足够多的赞同票。投反对票是一种强烈的否定,这就是为什么当你投反对票时,StackOverflow会给你负分,所以请谨慎使用它们。 - orad
@orad 谢谢,我没有意识到负评被视为如此“严重”。引用SO文档的话:“每当你遇到一个极其草率、没有付出努力的帖子或者一个明显而且可能危险错误的答案时,请使用你的负投票。” 我已经取消了我的负投票(因为这个答案是有效的)。然而,似乎回答更多地是关于作者展示他们的JavaScript技能,而不是提供一个可读的解决方案。 - Bataleon
尽管这看起来漂亮和花哨,但我不建议这样做,因为它可能会触发两个副本! - Valentino Miori
显示剩余2条评论

2

我更喜欢使用简单的数组过滤器:

const myArray = ['one', 2, 3, 4, 5];
const filterFirstLast = (e, i, a) => i === 0 || i === a.length - 1;
const [ first, last ] = myArray.filter(filterFirstLast);
console.log(first, last); // outputs: 'one', 5

// dealing with insufficient input is another topic (input array length < 2)
console.log(['one'].filter(filterFirstLast )); // outputs: ['one']
console.log([].filter(filterFirstLast )); // outputs: []

转换成其他形式很容易。
const obj = { [first]: last }; // will be: { one: 5 }, but never { one: "one" }
// OR, if you allow ['one'] to apply for both, if last is nullish (e.g. undefined, null, ""):
const obj = { [first]: last || first }; // will be: { one: 5 }, can be { one: "one" }

1

另一种roli答案的变体

function firstAndLast(array) {
    return { [[...array].shift()]: [...array].pop() };
}

请在您的答案中添加适当的解释。 - B001ᛦ

0
In Array :- Check first and last element in array are same or not.. 
function hasSame(arr1, arr2) {
    for(i=0; i <arr1.length ; i++) {
    for(j=0; j <arr2.length ; j++) {
        if(arr1[0] === arr2[0] && arr1[2] ===  arr2[2]) {
            return true
        } else
          return false;
    }
}
}

console.log(hasSame(
    ["white bread", "lettuce", "toast"],
    ["white bread", "tomato", "toast"]
))

如果您添加答案的解释,那将更好。 - Sunderam Dubey

0
为了使你的firstlast属性按照你的意愿工作,将它们定义为数组原型上的“getter”属性。
(你还有一个firstAndLastArraytransformFirstAndLast之间的不一致性需要修复。)
返回{firstName: lastName}将不会做你想要的事情,因为它将产生键firstName。要使用实际的名字作为键,请使用计算属性名称{[firstName]: lastName})。

Object.defineProperties(Array.prototype, {
  first: { get() { return this[0]; }},
  last:  { get() { return this[this.length - 1]; }}
});

var myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

function firstAndLast(array) {
  var firstItem = myArray.first;
  var lastItem = myArray.last;
  
  return {[firstItem]: lastItem};
}

var display = firstAndLast(myArray);

console.log(display);

或者,更简单地说,只需
function firstAndLast(array) {
  return {[array[0]]: array[array.length - 1]};
}

如果您不想或无法使用计算属性名称,则可以这样做。
function firstAndLast(array) {
  var result = {};
  result[array[0]] = array[array.length - 1];
  return result;
}

Rodel: Bestus - user4616966
OP已经说了无数遍。 - user4616966
2
@TyQ,如果我请求一百万次兰博基尼,你能给我买吗? - zerkms

0

像这样做:

var myArray = ['Rodel', 'Mike', 'Ronnie', 'Betus'];

function firstAndLast(myArr) {

    var firstItem = myArr[0];
    var lastItem = myArr[myArr.length - 1];
    var objOutput = {}; 
    objOutput[firstItem] = lastItem;
    return objOutput;
}

var display = firstAndLast(myArray);

console.log(display);

0

好的,我有另一个想法...例如:

const all = ['food', 'clean', 'cat', 'shower', 'work out']
console.log(`you have ${all.length} all!`)
console.log(`Todo: ${all[0]}`)
console.log(`Todo: ${all[all.length - 1]}`)

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