无法使用数组索引创建JS对象作为关键字&值?

时间:2017-10-26 13:45:21

标签: javascript arrays object indexing

任务:将数组转换为具有一个键值对的对象,其中第一个数组项是键,最后一个数组项是值。

,例如,[1,2,3]应转换为{1:3}

我无法将其作为:



function transformFirstAndLast(array) {
  var firstLast = {
    array[0]: array[-1]
  };
  return firstLast
}




但仅限于:



function transformFirstAndLast(array) {
  var firstLast = {};
  firstLast[array[0]] = array[array.length - 1];
  return firstLast
}




......为什么第一部作品没有?为什么不能为密钥和数组索引数组?值?

3 个答案:

答案 0 :(得分:3)

您可以弹出最后一个元素并为该对象获取计算属性。 (对于第一个元素,如果您愿意以同样的方式执行,可以使用Array#shift。)



function transformFirstAndLast(array) {
    return { [array[0]]: array.pop() };
}

console.log(transformFirstAndLast([1, 2, 3]));




带有临时变量的ES5。



function transformFirstAndLast(array) {
    var temp = {};
    temp[array[0]] = array.pop();
    return temp;
}

console.log(transformFirstAndLast([1, 2, 3]));




答案 1 :(得分:0)

拿第一个很容易,拿最后一个是大小减去这样的一个:

function firstAndLast(array) {
    var ary = {};
    ary[array[0]] = array[array.length - 1];
    return ary;
}

console.log(firstAndLast([1,2,3]))

答案 2 :(得分:0)

首先,您必须记住,数组是一种JavaScript对象,并且在JavaScript中,可以通过两种方式访问​​或分配对象属性(a.k.a。“key”):

通过“点符号”

object.property = value;

通过数组语法

object["property"] = value;

接下来,请记住,在JavaScript中,如果为不存在的属性分配值(使用上面的任一语法),则将创建属性,如下所示:

console.log(window.someNewProperty);         // undefined
window.someNewProperty = 17;                 // This causes the property to be created
window["someOtherNewProperty"] = "Voilla!";  // So does this, just with array syntax
console.log(window.someNewProperty);         // 17
console.log(window["someOtherNewProperty"]); // "Voilla!"

现在,继续讨论数组的细节,理解对象属性/键名(总是表示为字符串)和数组索引(总是非负整数)之间的区别至关重要。到JavaScript中的最大整数)。因此,如果您有一个数组并且似乎为负索引赋值,那么您实际上是在创建一个名为负索引的属性,而不是实际添加到数组的长度或在数组中创建新的索引位置。我们可以在这里看到:

var myArray = ["a", "b", "c"];
myArray[-1] = 15;

console.log(myArray.length);  // 3 not 4
console.log(myArray[-1]);     // 15

// Now to prove that -1 is a string name for a new property and not an index:
console.log(myArray);  // Notice no 15 in the indexed values?

// And, if we enumerate the object (not just the indexes), we'll see that we actually created 
// a property with [-1], not a new index.
for(var prop in myArray){
  // Note that prop is not the value of the property, it's the property name itself
  console.log(typeof prop, prop, myArray[prop]);
}

因此,总而言之,Arrays具有非负整数索引来存储构成数组length的项,但是Arrays也是对象并具有属性,就像所有其他对象一样。使用非负整数以外的任何括号分配作为键名将成为新属性,而不是数组索引。