子阵列选择

时间:2018-03-12 15:39:30

标签: javascript ecmascript-6

我想在javascript中完成(只是为了好玩)一个子数组选择python。类似的东西:

let a = ["a","b","c","d"]
console.log(a[[0,2]])
//prints ["a","c"]

一种(一种冗长的)方式可能是使用代理:

var handler = {
  get: function(target, name) {
    console.log("type of name", typeof(name)) //it prints "string"!
    if (name in target) {
      return target[name];
    }
    if (name == 'length') {
      return Infinity;
    }
    if (Array.isArray(name)) {
      return target.filter((v, i) => ~name.indexOf(i))
    }
  },
  set: function(target, property, value, receiver) {
    target[property] = value;
    return true;
  }
};

var originalArray = ["a", "b", "c", "d"];
var p = new Proxy(originalArray, handler);

console.log(p[[1, 2, 4]]);

如果我传递数组get函数,它将自动转换为字符串!为什么这样做?

有一种方法可以构建一个结构,在这种结构中可以选择元素吗? a[[0,2]]

2 个答案:

答案 0 :(得分:1)

您可以查找逗号,因为属性是字符串,并且您将数组中的连接字符串作为键。



var handler = {
    get: function(target, name) {
        if (name.includes(',')) {
            return name.split(',').map(i => target[i]);
        }
        return target[name];
    },
    set: function(target, property, value, receiver) {
        target[property] = value;
        return true;
    }
};

var originalArray = ["a","b","c","d"];
var p = new Proxy( originalArray, handler );

console.log(p[[1,2,4]]);  // ["b", "c", undefined]
console.log(p['length']); // 4




答案 1 :(得分:1)

我认为你将p [[1,2,4]]与传递给代理的数组混淆了。 这里,p是javascript中的一个对象,当我们编写objectName [xyz]时,它是我们所指的对象的xyz属性。 作为获取陷阱,属性的名称和属性的名称在javascript中是字符串类型。因此,你传递的数组在这里被理解为一个字符串。