修改数组元素访问权限使其成为基于1的索引

时间:2018-08-10 12:21:59

标签: javascript

我遇到了一个苦苦挣扎的代码战演习:https://www.codewars.com/kata/scraping-codewars-top-500-users/train/javascript

我希望能够像访问1索引而不是0索引一样访问数组。

例如,如果我有此数组:

let a = [1, 2, 3, 4, 5]

我想做a[5]并得到5(而不是4)。

到目前为止,我已经提出了:

Array.prototype.get = function(i, fallback) {
  return this[i-1] || fallback;
}

并带有:

class BaseOneArray extends Array {
    constructor(...args) { 
        super(...args); 
    }
    get(i, fallback) {
        return this[i-1];
    }
}

但是,这两种方法仅在以如下方式访问数组时有效:a.get(4),而在以如下方式进行访问时则无效:a[4]

如何使数组中的[]运算符像数组具有从1开始的索引一样工作?

数组必须具有相同数量的项目,所以我不能只是在第一个位置添加填充值以将所有元素向上移动一个位置。

3 个答案:

答案 0 :(得分:2)

要影响属性访问,您可以使用增加每个属性访问权限的代理:

DBContext

通过代理基础数组,它仍然保持基于零的状态,只是更改了它的“视图”,因此,如果将该数组用于不受影响的其他地方。

答案 1 :(得分:1)

如果您可以修改阵列,则可以执行以下操作。

let a = [1, 2, 3, 4, 5]
a = [undefined, ...a];

console.log("a[5] is ", a[5]);
console.log("a[0] is ", a[0]); // Same as accessing any undefined index. See below
console.log("a[100] is ", a[100]);

答案 2 :(得分:1)

代码测试未指定您需要一个数组,它只是说“ Leaderboard#position [i]应该返回第ith位用户(基于1的索引)”。您应该能够简单地使用带有数字键的对象,然后:

const leaderboard = yourFetchedAndParsedLeaderboardDomElementArray
  .reduce((acc, row, index) => Object.assign(acc, {
    [index + 1]: {
      // get the following ones from `row` somehow:
      name: ...,
      clan: ...,
      author: ...
    }
  }), {});

您可以使用对象传播语法(如果有的话)来代替Object.assign