我可以从元素内部获取元素的索引吗?数组

时间:2018-09-23 22:48:32

标签: javascript arrays anonymous-function

所以说我有一个数组:

我可以通过调用一个元素来告知其位置吗?假设它是一个函数。

var h = ["0", "1", () => { /* code */ }, "3"];

匿名函数将自我评估为"2"

的地方

2 个答案:

答案 0 :(得分:4)

我们可以通过创建一个函数并覆盖其功能来使用代理。我们还需要在阵列上创建一个代理。这可以通过代理内的代理来完成。一种修改函数,另一种修改数组。然后我们可以像普通的数组函数一样调用它。

// The original function
function TheFunction(idx, arg1) {
  console.log('Index:', idx, '--', 'Argument:', arg1)
  return Math.round(Math.random() * 100000)
}

let h = ["0", "1", TheFunction, "3", TheFunction];

// Create a Proxy on the array
h = new Proxy(h, {
  // Execute when an array item is accessed
  get(target, prop) {
    // Test if the item is a function
    if(typeof target[prop] != 'function') throw new Error('Not a function!')
    // Create a new Proxy on the original function
    return new Proxy(TheFunction, {
      // When the function gets called run this instead of what was actually called
      apply(target, thisArg, arguments) {
        return target(prop, ...arguments)
      }
    })
  }
})

console.log('Result:', h[2]('hello'))
console.log('Result:', h[4]('world'))

否则,我们将无法直接执行它。函数不知道它们在脚本中的位置,也不知道它们是否在全局范围,窗口,数组,对象等中。您需要一个中间人或助手,在这种情况下,我们可以使用{ {1}}具有第二个参数,即项目的索引。然后,您可以将其作为这样的参数传递:

forEach

如果您的数组具有一个函数,则可以使用var h = ["0", "1", (idx) => { console.log(idx) }, "3"]; h.forEach((itm, idx) => { if(typeof itm == 'function') { itm(idx) } })执行类似的任务。但是,您仍然需要将索引传递给函数,以便函数可以使用它:

findIndex

不可能的另一个原因是因为可以引用函数,因此可以在数组或其他地方使用它。如您在这里看到的,我们引用了一个函数,以及一个在数组外部调用的函数。被调用的函数不知道该调用是来自数组还是数组之外。

var h = ["0", "1", (idx) => { console.log(idx) }, "3"];

let idx = h.findIndex(i => typeof i == 'function')
idx > -1 && h[idx](idx)

答案 1 :(得分:-1)

是的,您可以循环数组并在内部检查元素类型是否为函数:

var h = ["0", "1", () => {}, "3"]

for(var i = 0; i < h.length; i++){
    if(typeof h[i] === 'function'){
        console.log(i)
    }
}

如果是,只需获取元素的索引。