【问题标题】:Replace names of array objects dynamically by string content用字符串内容动态替换数组对象的名称
【发布时间】:2022-11-23 23:25:20
【问题描述】:

为了减少我的最后一个问题(有点复杂)。是否可以动态更改“数组对象”的名称?

我有一个变量列表(结构必须保持这样):

var markers = []
var markerHouse = ... markers.push(markerHouse);
var markerAnimal = ... markers.push(markerAnimal);
var markerCar = ... markers.push(markerCar);
// aso.

我尝试了很多方法来更改数组对象名称,比如这个:

var NewMarkers = "markerHouse, markerAnimal"; // string content, generated by a function
var NewMarkersArray = NewMarkers.split(","); // create array of this string
var NewGroup = L.layerGroup([NewMarkersArray]); // request for array of objects

NewGroup的结果是:

L.layerGroup(["markerHouse", "markerAnimal"]);

我得到一个“TypeError:不能使用'in'运算符在“markerHouse”中搜索“_leaflet_id”......

但我需要的是:

L.layerGroup([markerHouse, markerAnimal]);

【问题讨论】:

  • 如果您需要访问这样的变量,则不应使用变量。相反,使用值数组或具有属性名称的对象。然后你可以干净利落地做你想做的事。
  • NewMarkers 是如何创建的?另外,var markerHouse = ... markers.push(markerHouse); 是什么意思?
  • 我同意你的看法,但传单似乎不支持经典的“带有属性名称的对象方式”,如果我是对的话。
  • 您可能需要一个带有 const marker = { house: "value", car: "value2", animal: "", etc} 的对象,然后根据您的要求创建一个过滤值数组
  • @adiga 我通过一个函数循环获得了这个值,该函数循环搜索特定内容。 “var markerHouse = ....”的其余部分也只是坐标。

标签: javascript jquery leaflet


【解决方案1】:

你需要评估吗?

L.layerGroup([eval("markerHouse"), eval("markerAnimal")]);

【讨论】:

  • 绝对不会需要eval()
  • 我读了很多关于“eval”的“警告”......不确定,如果这是我应该走的路?我的问题是,这个“NewMarkers”字符串是动态生成的(通过循环),所以我不知道它的确切单词和数量。
  • 顺便说一句,你可以循环数组 const a = '2 + 2';常量 b = '2 + 3' 常量 arr = [a,b]; arr.map(el => { console.log(eval(el)); }) @pepe 是的,eval 不确定,因为您可以从字符串运行代码,所以您需要确保它是安全的。替代是功能(但概念是相同的)。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

按照其他问题中的建议使用 eval() 被认为是一种不好的做法。

通过变量的字符串名称检索变量的最直接方法是通过它的范围。变量的范围是“this”(对于全局变量也是“window”)。

所以你可以这样做:

L.layerGroup( [ this["markerHouse"], this["markerAnimal")] ]);

或者:

L.layerGroup( [ window["markerHouse"], window["markerAnimal")] ]);

为您的全局变量。

并使用动态变量名称:

var dynamicallyGeneratedArrayOfVarNames = "markerHouse,markerAnimal".split(',');
L.layerGroup( [ this[dynamicallyGeneratedArrayOfVarNames[0]], this[dynamicallyGeneratedArrayOfVarNames[1])] ]);

请参见下面的 sn-p:

var markerHouse = 'markerHouse content';
var markerAnimal = 'markerAnimal content'
// In a local scope
console.log(this['markerHouse']);
console.log(this['markerAnimal']);

// Or global scope
console.log(window['markerHouse']);
console.log(window['markerAnimal']);

// Notice how this === window when not in function or class
console.log('this === window: '+(this===window))

// And with dynamically retrieved names
var NewMarkers = "markerHouse, markerAnimal"; // string content, generated by a function
var NewMarkersArray = NewMarkers.split(", "); // create array of this string
console.log(this[NewMarkersArray[0]])
console.log(this[NewMarkersArray[1]])

不过,如果您有能力重构初始代码,那么最佳做法是在创建时按名称存储变量,例如:

const myvars = {}
myvars.markerHouse = "any type of marker house data"
myvars.markerAnimal = "any type of marker animal data"

L.layerGroup( [ myvars["markerHouse"], myvars["markerAnimal")] ]);

【讨论】:

  • 这是假设他们的代码在全局级别而不是在函数或类中
  • 这就是引用“this”范围的原因
  • 谢谢你的例子。如果我是对的,这种方法也只有在我知道确切的字符串“words”及其数量的情况下才有效,对吧?在我的情况下,这个字符串内容和数量是动态生成的。
  • 不,不是真的,您可以使用字符串变量而不是名称。让我更新这个例子。
  • 呃... this 在函数中不能那样访问局部变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多