如何在 javascript 数组上迭代新的 class 实例?
How to iterate new class intances over a javascript array?
我有一个如下所示的数组:
var array = ["name", " zip", " city", " 51.408", "1.333", " 5.008", "name2", "zip2", "city2", " 51.404", "4.999", "2.434"]
它包含来自 2 个用户的数据。我想在下面创建 class 的 2 个实例。
class User {
constructor(name, zip, city, x, y) {
this.name = name;
this.zip = zip;
this.city = city;
this.x = x;
this.y = y;
}
数组的第 6 个和最后一个元素未在 class 中使用。
这是我写的迭代:
for (var i = 0; i < array.length; i++) {
var user1 = new User(arrayData[i], arrayData[i+1], arrayData[i+2], arrayData[i+3], arrayData[i+4], arrayData[i+5])
var user2 = new User(arrayData[i+6], arrayData[i+7], arrayData[i+8], arrayData[i+9], arrayData[i+10], arrayData[i+11])
}
它工作正常,但如您所见,这并不是真正智能的代码和平。我想让它变得更好。另外,我不知道如何让它适用于 n 个用户。你有什么想法吗?
我想你正在寻找
var users = [];
for (var i = 0; i < array.length; i += 6) {
// ^^^^^^
var user = new User(arrayData[i], arrayData[i+1], arrayData[i+2], arrayData[i+3], arrayData[i+4], arrayData[i+5]);
users.push(user);
}
console.log(users);
(循环条件用i+5 < array.length
会更准确,但没关系,只要保证数组长度总是6的倍数即可)
@trincot 遵循相同的思路,用更简洁的代码(映射、切片、展开)实现了相同的结果,我尽量保持与原始代码一样简单。
您的循环实际上应该只在其主体中创建一个用户,并且 i
应该以 6 的步长递增。
您也可以使用一个参数分布来避免您必须分别处理这五个参数。
最后,使用 Array.from
您可以循环并创建一个用户数组:
class User {
constructor(name, zip, city, x, y) {
this.name = name;
this.zip = zip;
this.city = city;
this.x = x;
this.y = y;
}
}
var array = ["name", " zip", " city", " 51.408", "1.333", " 5.008", "name2", "zip2", "city2", " 51.404", "4.999", "2.434"];
let users = Array.from({length: array.length / 6}, (_, i) =>
new User(...array.slice(i*6, i*6+5)) // Not including the unused 6th value
);
console.log(users);
您可以使用 reduce
方法和 %
余数运算符来获取每个 nth
元素,然后使用 slice
和剩余运算符来获取 [=23] 的数据=]实例.
var array = ["name", " zip", " city", " 51.408", "1.333", " 5.008", "name2", "zip2", "city2", " 51.404", "4.999", "2.434"]
class User {
constructor(name, zip, city, x, y) {
this.name = name;
this.zip = zip;
this.city = city;
this.x = x;
this.y = y;
}
}
const users = array.reduce((r, e, i, a) => {
if (i % 6 === 0) {
const props = a.slice(i, i + 6);
const user = new User(...props);
r.push(user);
}
return r;
}, [])
console.log(users)
我有一个如下所示的数组:
var array = ["name", " zip", " city", " 51.408", "1.333", " 5.008", "name2", "zip2", "city2", " 51.404", "4.999", "2.434"]
它包含来自 2 个用户的数据。我想在下面创建 class 的 2 个实例。
class User {
constructor(name, zip, city, x, y) {
this.name = name;
this.zip = zip;
this.city = city;
this.x = x;
this.y = y;
}
数组的第 6 个和最后一个元素未在 class 中使用。
这是我写的迭代:
for (var i = 0; i < array.length; i++) {
var user1 = new User(arrayData[i], arrayData[i+1], arrayData[i+2], arrayData[i+3], arrayData[i+4], arrayData[i+5])
var user2 = new User(arrayData[i+6], arrayData[i+7], arrayData[i+8], arrayData[i+9], arrayData[i+10], arrayData[i+11])
}
它工作正常,但如您所见,这并不是真正智能的代码和平。我想让它变得更好。另外,我不知道如何让它适用于 n 个用户。你有什么想法吗?
我想你正在寻找
var users = [];
for (var i = 0; i < array.length; i += 6) {
// ^^^^^^
var user = new User(arrayData[i], arrayData[i+1], arrayData[i+2], arrayData[i+3], arrayData[i+4], arrayData[i+5]);
users.push(user);
}
console.log(users);
(循环条件用i+5 < array.length
会更准确,但没关系,只要保证数组长度总是6的倍数即可)
@trincot 遵循相同的思路,用更简洁的代码(映射、切片、展开)实现了相同的结果,我尽量保持与原始代码一样简单。
您的循环实际上应该只在其主体中创建一个用户,并且 i
应该以 6 的步长递增。
您也可以使用一个参数分布来避免您必须分别处理这五个参数。
最后,使用 Array.from
您可以循环并创建一个用户数组:
class User {
constructor(name, zip, city, x, y) {
this.name = name;
this.zip = zip;
this.city = city;
this.x = x;
this.y = y;
}
}
var array = ["name", " zip", " city", " 51.408", "1.333", " 5.008", "name2", "zip2", "city2", " 51.404", "4.999", "2.434"];
let users = Array.from({length: array.length / 6}, (_, i) =>
new User(...array.slice(i*6, i*6+5)) // Not including the unused 6th value
);
console.log(users);
您可以使用 reduce
方法和 %
余数运算符来获取每个 nth
元素,然后使用 slice
和剩余运算符来获取 [=23] 的数据=]实例.
var array = ["name", " zip", " city", " 51.408", "1.333", " 5.008", "name2", "zip2", "city2", " 51.404", "4.999", "2.434"]
class User {
constructor(name, zip, city, x, y) {
this.name = name;
this.zip = zip;
this.city = city;
this.x = x;
this.y = y;
}
}
const users = array.reduce((r, e, i, a) => {
if (i % 6 === 0) {
const props = a.slice(i, i + 6);
const user = new User(...props);
r.push(user);
}
return r;
}, [])
console.log(users)