GithubHelp home page GithubHelp logo

第 30 题:使用ES6 的Proxy实现数组负索引。 (负索引:例如,可以简单地使用arr[-1]替代arr[arr.length-1]访问最后一个元素,[-2]访问倒数第二个元素,以此类推) about fe-interview HOT 14 OPEN

lgwebdream avatar lgwebdream commented on May 1, 2024
第 30 题:使用ES6 的Proxy实现数组负索引。 (负索引:例如,可以简单地使用arr[-1]替代arr[arr.length-1]访问最后一个元素,[-2]访问倒数第二个元素,以此类推)

from fe-interview.

Comments (14)

xiaotianxia avatar xiaotianxia commented on May 1, 2024 14
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

from fe-interview.

zengxiaoluan avatar zengxiaoluan commented on May 1, 2024 3
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])

from fe-interview.

Genzhen avatar Genzhen commented on May 1, 2024
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]; 

from fe-interview.

yaooooooooo avatar yaooooooooo commented on May 1, 2024

楼上的成倍数索引有问题。

from fe-interview.

MADAO-art avatar MADAO-art commented on May 1, 2024
    "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]);

from fe-interview.

yh27tc avatar yh27tc commented on May 1, 2024
function ArrProxy(arr) {
    return new Proxy(arr, {
        get(arr, index) {
            // 模拟机器取模运算
            const modIndex = index % arr.length;
            return arr[modIndex < 0 ? arr.length + modIndex : modIndex];
        },
        set(){}
    })
}

from fe-interview.

zojize avatar zojize commented on May 1, 2024
// 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);
    },
  });
}

from fe-interview.

Luoyuda avatar Luoyuda commented on May 1, 2024
    function proxyArray(arr){
        return new Proxy(arr, {
            get(target, key){
                if(key >= 0) return target[key]
                let len = target.length
                return target[len + (key % len)]
            }
        })
    }
    var arr = proxyArray([1, 2, 3, 4, 5, 6, 7, 8, 9]);
    console.log(arr[0], arr[1])
    console.log(arr[-10], arr[-20])

from fe-interview.

geekftz avatar geekftz commented on May 1, 2024

const newArrayProducer = (arr) =>
new Proxy(arr, {
get: function (obj, prop) {
console.log('%c prop = %s', 'color: #408059', prop);

  prop = prop >= 0 ? prop : arr.length - Math.abs(prop);

  return obj[prop];
},

});

var newArr = newArrayProducer([1, 2, 3]);

from fe-interview.

1uckyneo avatar 1uckyneo commented on May 1, 2024
const genNegativeIndexAccessibleArray = <T>(arr: T[]) => {
  return new Proxy(arr, {
    get(target, key) {
      if (typeof key !== 'symbol') {
        const index = Number.parseInt(key, 10);

        if (index < 0) {
          const computedIndex = target.length + index;
          return Reflect.get(target, computedIndex);
        }
      }

      return Reflect.get(target, key);
    },
  });
};

const a = genNegativeIndexAccessibleArray([
  1, 2, 3, 4, 5, 6, 7, 8, 9,
]);

console.log(a[1]); // 2
console.log(a[-1]); // 9
console.log(a[-2]); // 8

from fe-interview.

zizxzy avatar zizxzy commented on May 1, 2024

proxy的介绍proxy
利用proxy重写[]

const negativeIndex = arr => {
  return new Proxy(arr, {
    get: (target, proKey) => {
      let index = Number(proKey);
      let length = target.length;
      while (index < 0) {
        index += length;
      }
      return target[index];
    }
  })
}

console.log(negativeIndex([1, 2, 3, 4, 5, 6, 7])[-1]);
console.log(negativeIndex([1, 2, 3, 4, 5, 6, 7])[-20]);

from fe-interview.

LiquidLiquids avatar LiquidLiquids commented on May 1, 2024

不判断数字索引,length push访问是有问题的。

from fe-interview.

lang711 avatar lang711 commented on May 1, 2024
    const proxyArr = arr => new Proxy(arr, {
      get(target, key, proxy) {
        let index = (target.length + +key) % target.length;
        return target[+index];
      },
      set(target, key, value, proxy) {
        
      },
    });
    // 测试
    const arr = [2, 34, 65, 7, 4, 56, 78, 5, 2, 8, 0, 5, 98, 435];
    console.log(proxyArr(arr)[-1]);

from fe-interview.

chinbor avatar chinbor commented on May 1, 2024
const negativeArr = (ele) => {
  return new Proxy(ele, {
    get(target, key, receiver) {
      if (Array.isArray(ele)) {
        const len = target.length
        const intKey = Number(key)

        return Reflect.get(target, intKey < 0 ? len + intKey : intKey, receiver)
      }

      return Reflect.get(target, key, receiver)
    }
  })
}

const test = negativeArr([1, 2, 3, 4, 5])
console.log(test[-1])
console.log(test[-2])

const obj = negativeArr({'-1': 1, '-2': 2})
console.log(obj[-1])
console.log(obj[-2])

from fe-interview.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.