我想在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]]
答案 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中是字符串类型。因此,你传递的数组在这里被理解为一个字符串。