如何以编程方式确定sequence元素关联的items数组索引
如何确定引用序列元素对应原数组的索引?
首先看这段创建指向items数组元素引用序列的代码:
class Item { constructor(text) { this.text = text; }} let items = [new Item ('a'), new Item ('b'), new Item ('c'), new Item ('a')] let sequence = [items[0], items[3], items[1]] console.log(sequence[2].text); //'b'
我们可以通过修改原数组元素来证明sequence保存的是引用而非复制:
items[1].text= 'bb'; console.log(sequence[2].text); //'bb'
从代码里能看到sequence[1]关联的是items[3],但如何通过编程方式自动确定这种对应关系?
解决方案
由于JavaScript中对象是引用类型,同一个对象的引用在严格相等(===)判断下会返回true。我们可以利用Array.prototype.findIndex()方法,遍历sequence中的每个元素,在items数组中查找与之严格相等的元素,从而得到对应的原数组索引。
示例代码:
// 遍历sequence,获取每个元素对应的items索引 sequence.forEach((element, seqIndex) => { const originalIndex = items.findIndex(item => item === element); console.log(`sequence[${seqIndex}] 对应 items 的索引是 ${originalIndex}`); });
运行这段代码会输出:
sequence[0] 对应 items 的索引是 0 sequence[1] 对应 items 的索引是 3 sequence[2] 对应 items 的索引是 1
说明
findIndex()会返回数组中第一个满足测试函数的元素的索引,这里的测试函数用item === element判断是否为同一个对象引用,能精准匹配到原数组中的对应元素。- 即使原数组中有内容相同但引用不同的对象(比如示例中的
items[0]和items[3]都是text='a'的Item实例),该方法也能正确区分,因为它们是不同的对象引用。
内容的提问来源于stack exchange,提问作者user2309803
相关产品推荐
相关产品推荐

