【问题标题】:Is there any way to change array elements indexing, so it starts 1, 2, 3, 4 instead of 0, 1 ,2, 3?有没有办法改变数组元素的索引,所以它从 1、2、3、4 而不是 0、1、2、3 开始?
【发布时间】:2018-09-30 07:02:51
【问题描述】:

我不想使用 push()/slice()/unshift() .etc 移动元素位置,因为即使我使用其中一种方法更改了元素位置',索引仍然从'开始0',而不是'1'。

我的目标是“操作元素 index”,所以当我回调它们时,它会从 1, 2, 3, 4 开始。 . .

这段代码基本上可以正常工作。我想操作数组元素索引:|

  $(function submenuTrigger(){
    var list = [
      ["", 'Urus', 'Aventador', 'Experiences', 'Few Off', 'Concept', 'Ad Personam', " "], // 0, 1, 2, 3, 4, 5 6 . .
      ["", 'People', 'History', 'Masterpieces', 'Design', 'Innovation & Exellences', " ", " ", " "],
      ["", "Locators", "Accessori Origianli", "Spare Parts", "Services", "Polo Storico", "Financial Services", " ", " "],
      ["", "News", "Events", "Museum", "Accademia", "Esperienza", "Lamborghini Lounge", "Mobile App", "  "],
      ["", "News", "Events", "Museum", "Accademia", "Esperienza", "Lamborghini Lounge", "Mobile App", "  "]
    ]
    var int_compare = 0;
    $('#home-menu-nav ul li').mouseenter(function(){
      var li_int = $(this).index() + 1; // make sure li indexes start 1, 2, 3, 4 . .
          list_int = list[li_int];      // make sure list's first elements start counting 1, 2, 3, 4 . .
          list_len = list_int.length;   // makes automatically count inside of for statement / loop_int = [list]
          int_compare = li_int;
          console.log(list_int)
          if(li_int == int_compare){
            for(p = 0; p < list_len; p++){
              console.log(list_len)
              $('#submenu-content-row-left ul li:nth-child('+ p +')').html(list[li_int - 1][p]);
              nbsp = list[li_int - 1][p]
            }
          } else {
            console.log('none');
            return
          }
    })
  })
 
<div id="home-menu-nav">
  <ul>
    <li>MODELS</li>
    <li>BRAND</li>
    <li>OWNDERSHIP</li>
    <li>EXPERIENCE</li>
    <li>MOTORSPORT</li>
    <li>STORE</li>
  </ul>
</div>
 <div id="submenu-content-row-left">
  <ul>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
  </ul>
 </div>

如果可以的话,我想更改元素的索引

【问题讨论】:

  • 为什么要对抗语言最基本的方面之一?
  • 您需要在向用户展示时添加 +1,在接受输入时添加 -1。我们在这个问题上花费的时间比你输入 +1 和 -1 的时间还要多,如果你这样做一百次。有时,编程中的一个坏习惯是花费大量精力来节省少量精力。这些是使代码不可读且难以修复的优化类型。写出来并遵循标准可以很容易地了解您的代码中发生了什么。
  • 如果围绕数组从零开始的事实构建,则无需添加 +1 或 -1。数以百万计的 JavaScript(以及 c 和 python 以及 java 和 c++ 等)程序员管理。在许多情况下,它实际上要方便得多。这是来自Edsger Dijkstragood, short article 说明原因。
  • @joshstrike MarkMeyer 谢谢大家回答我。

标签: javascript html arrays indexing


【解决方案1】:

无论你是否愿意,所有数组都有一个 0 元素。那是数组的第一个元素。如果将第一个元素放在索引 1 处,则索引 0 处仍然有一个空元素,并且每次访问数组时都必须跳过它。

这只是所有现代编程语言工作方式的基本部分。当您向用户显示元素编号时,通常会向其添加 1 以供人类阅读。显然,如果你想在这里实现你的目标,你可以将一个空元素移到数组中。但是你仍然会在 0 处有一个空元素。

【讨论】:

  • '你可以将一个空元素移到数组中。但是你仍然会在 0 处有一个空元素。这是我不使用这些方法的主要原因。所以你的意思是没有办法操纵索引?
  • 不,因为在任何编程语言中,在底层,“数组”是内存空间的分配。当您声明一个数组时,您是在告诉计算机保留一大块内存地址,这些地址被映射到这个易于列出的东西中,它在您的数组变量中从零开始。它就像汽车发动机。如果您断开从分配器到第一个气缸上火花塞的电线,气缸仍然存在,分配器仍然工作,您只是没有在其中放火花。当您为数组分配内存时,第一个柱面称为“零”。也许是不好的类比。
  • 为了澄清我想说的,在一个非常基本的层面上,当您创建数组时,无论是否填充数组,数组的 0 元素都会映射到内存空间。此外,如果您在元素 3 处开始一个数组,那么即使它们是空的,0、1 和 2 也会映射到内存。对象 - 就像下面建议的人 - 是“稀疏”的,这意味着它们不需要填写所有先前的空格。但那是因为它们不是数字,它们使用的是字符串键。这使得它们不利于按顺序执行任何操作、计数它们或稍后移动它们(如果需要)。
【解决方案2】:

如果你绝对想要,创建一个CustomArray,它从Array 继承原型方法:

window.CustomArray = (function() {
  function CustomArray() {
    var customArray = Object.create(Array.prototype);
    customArray = (Array.apply(customArray, [null, ...arguments]) || customArray);
    Object.defineProperty(customArray, 'len', { 
      get: function(){ return this.length - 1 },
    });
    return (customArray);
  }
  return (CustomArray);
}).call({});

var a = new CustomArray('Urus', 'Aventador', 'Experiences', 'Few Off', 'Concept', 'Ad Personam');

console.log(a[1]);
console.log(a.len);

请注意,如果需要,您可以覆盖 CustomArray 上的原型方法,但无法覆盖像 length 这样的继承属性,这就是为什么我添加了返回 length-1len 属性。您还必须重写所有迭代器方法,以说明构造函数在索引 0 处添加了 null 元素。

【讨论】:

  • 你真的拯救了我的一天。赞赏!
  • 关于||. . . [null, ...arguments]) || customArray) 内部代表什么,我可以再问一件事吗?我知道|| 是 OR 的逻辑运算符,我确实理解除了那一行之外的整个代码。
【解决方案3】:

无论你是否愿意,所有数组都有一个 0 元素。

您的数组不能以 1 开头。有三种方法可以做到这一点:

选项 1:将 0 设置为 null

var myArray = {
  null,
  "item1",
  "item2"
};
document.write(myArray[1]);

选项 2:使用 unshift() 函数

var myArray = {
  "item1",
  "item2"
};
myArray.unshift();
document.write("myArray")

选项 3:如果您在页面上显示结果,请减去 1

var myArray = {
  "item1",
  "item2"
};
var itemToAccess = 1;
itemToAccess += -1;
document.write(myArray[itemToAccess])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多