如何在 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)