const negativeArray = els =>
new Proxy(els, {
get: (target, propKey, receiver) =>
Reflect.get(
target,
+propKey < 0 ? String(target.length + +propKey) : propKey,
receiver
)
});
const unicorn = negativeArray(["京", "程", "一", "灯"]);
unicorn[-1];
楼上的成倍数索引有问题。
"use strict";
let arr=[1,2,4,6,8,10];
function Arrchange(arr){
let proxy=new Proxy(arr,{
set(){},
get(arr,property){
if(property>=0){
return arr[property]
}else{
return arr[(arr.length+property*1)]
}
}
});
return proxy;
}
let brr=new Arrchange(arr);
console.log(brr[0]);
js
const proxyArray = arr => {
const length = arr.length;
return new Proxy(arr, {
get(target, key) {
key = +key;
while (key < 0) {
key += length;
}
return target[key];
}
})
};
var a = proxyArray([1, 2, 3, 4, 5, 6, 7, 8, 9]);
console.log(a[1]); // 2
console.log(a[-10]); // 9
console.log(a[-20]); // 8
function ArrProxy(arr) {
return new Proxy(arr, {
get(arr, index) {
// 模拟机器取模运算
const modIndex = index % arr.length;
return arr[modIndex < 0 ? arr.length + modIndex : modIndex];
},
set(){}
})
}
// 30.手写用 ES6proxy 如何实现 arr[-1] 的访问
function PythonArray(arr) {
return new Proxy(arr, {
get(target, prop, receiver) {
if ((key = Number.parseInt(prop))) {
const len = Reflect.get(target, 'length', receiver);
prop = key < 0 && Math.abs(key) <= len ? len + key : prop;
}
return Reflect.get(target, prop, receiver);
},
set(target, prop, value, receiver) {
if ((key = Number.parseInt(prop))) {
const len = Reflect.get(target, 'length', receiver);
prop = key < 0 && Math.abs(key) <= len ? len + key : prop;
}
return Reflect.set(target, prop, value, receiver);
},
deleteProperty(target, prop) {
if ((key = Number.parseInt(prop))) {
const len = target.length;
prop = key < 0 && Math.abs(key) <= len ? len + key : prop;
}
return Reflect.deleteProperty(target, prop);
},
});
}
var arr = [1,2,[3,[4,[5]]]]
function proxyArr(arr) {
for(let i = 0; i < arr.length; i++) {
let item = arr[i];
if(Array.isArray(item)) arr[i] = proxyArr(item)
}
return new Proxy(arr,{
get(arr, index, proxiedArr){
let len = arr.length
index = +index
index = index < 0 ? index + len : index
return arr[index]
}
})
}
var proxied = proxyArr(arr)
console.log(proxied[-1][-1][-1][-1])
Most helpful comment
js const proxyArray = arr => { const length = arr.length; return new Proxy(arr, { get(target, key) { key = +key; while (key < 0) { key += length; } return target[key]; } }) }; var a = proxyArray([1, 2, 3, 4, 5, 6, 7, 8, 9]); console.log(a[1]); // 2 console.log(a[-10]); // 9 console.log(a[-20]); // 8