Reputation: 45
Hi I want to get alert "lkb_1" and "lkb_2" , but this code gives me "product_1_name" and "product_1_name" ;
eval and window functions I can get rid of them but I think they are not recommended to do that.. so is there any other solution rather than eval and window functions?
<script>
product_1_name = "lkb_1";
product_1_pcs = 3;
product_2_name = "lkb_2";
product_2_pcs = 5;
profil_ismi = "";
const profil_listesi = ["product_1", "product_2"];
i = 0;
while (i < profil_listesi.length) {
profil_ismi = profil_listesi[i] + "_name";
alert(profil_ismi);
i = i + 1;
}
</script>
Upvotes: 1
Views: 1229
Reputation: 6089
You can use eval
in this case. It is safe, because it is evident that it cannot be misused for code injection in this particular case.
Still, I think it would be better (more scalable, more future proof), to have an array of products, as follows:
var products = [
{ id: 'product_1', name: 'lkb_1', pcs: '3'},
{ id: 'product_2', name: 'lkb_2', pcs: '5'}
];
const profil_listesi = ["product_1", "product_2"];
i = 0;
while (i < profil_listesi.length) {
profil_ismi = products.find(p => p.id === profil_listesi[i])
alert(profil_ismi.name);
i = i + 1;
}
Upvotes: 1
Reputation: 17556
To avoid using eval you can do that.
The thing would work well if you wrap the product names in an array. then you can dynamically create the variable name and thus specifically retrieve the value in the array.
arr = []
arr['product_1_name'] = "lkb_1" ;
product_1_pcs = 3 ;
arr['product_2_name'] = "lkb_2" ;
product_2_pcs = 5 ;
profil_ismi = "" ;
const profil_listesi = ["product_1","product_2"];
let i=0;
while (i<profil_listesi.length)
{
let _name = profil_listesi[i] + '_name'
profil_ismi = arr[_name];
alert (profil_ismi) ;
i=i+1;
}
Upvotes: 1