【问题标题】:Push value of key from array to another array in a for loop JavaScript在for循环JavaScript中将键的值从数组推送到另一个数组
【发布时间】:2018-06-26 11:01:16
【问题描述】:

我正在尝试从第一个数组中存在的键中推送一个值。这个数组由一个country_users 数组组成,我已经遍历了这个数组中的每个用户数组,并将它们推送到一个名为users的新数组中

在此演示中,我尝试将 countrycountry_users 推送到 users 数组中的每个用户对象。

我为此目的使用 Vue.js,使用 Vue 可能更容易吗?有什么建议吗?

var users = [];
var country_users = [
  {
    "country": "United States",
    "users": [
      {
        "name": "John"
      },
      {
        "name": "Jane"
      },
    ],
  },
  
  {
    "country": "Norway",
    "users": [
      {
        "name": "Ola"
      },
      {
        "name": "Jens"
      },
    ],
  },
  
];

// Here I push all users from country_users into a new array called users
for (let cu = 0; cu < country_users.length; cu++) {
  for (let u = 0; u < country_users[cu].users.length; u++) {
  users.push(country_users[cu].users[u]);
  }
  
  // Do I make a new for loop here to push the country into every object inside users array? How?
}

console.log(users);

我想从用户之前所属的数组中推送国家。

我想要的结果是users这样的数组

var users = [
 {
"name": "John",
"country": "United States"
  },
  {
"name": "Jane",
"country": "United States"
  },
  {
"name": "Ola",
"country": "Norway"
  },
  {
"name": "Jens",
"country": "Norway"
  }
];

console.log(users);

解决方案

var users = [];
var country_users = [
  {
    "country": "United States",
    "users": [
      {
        "name": "John"
      },
      {
        "name": "Jane"
      },
    ],
  },
  
  {
    "country": "Norway",
    "users": [
      {
        "name": "Ola"
      },
      {
        "name": "Jens"
      },
    ],
  },
  
];

country_users.forEach((country_user) => {
  country_user.users.forEach((user) => {
     user.country = country_user.country;
     users.push(user);
  });
});

console.log(users);

【问题讨论】:

  • 为什么 john 不是 jane 而 jens 不是 ola?如果是第一个,那么 ola 而不是 jens ...?
  • @NinaScholz 对不起,我的错。我希望 country_users 数组中的所有用户都得到相同的结果。

标签: javascript arrays vue.js


【解决方案1】:

您可以迭代给定数组及其用户数组,并使用所需属性构建一个新数组。

var country_users = [{ country: "United States", users: [{ name: "John" }, { name: "Jane" }] }, { country: "Norway", users: [{ name: "Ola" }, { name: "Jens" }] }],
    users = country_users.reduce(function (r, country) {
        country.users.forEach(function (user) {
            r.push({ name: user.name, country: country.country });
        });
        return r;
    }, []);
    
console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6

var country_users = [{ country: "United States", users: [{ name: "John" }, { name: "Jane" }] }, { country: "Norway", users: [{ name: "Ola" }, { name: "Jens" }] }],
    users = country_users.reduce((r, { country, users }) => {
        users.forEach(({ name }) => r.push({ name, country }));
        return r;
    }, []);
    
console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    您可以使用Array.prototype.reduce 并在每次迭代中创建并返回包含用户和国家/地区的新数组:

    const country_users = [
      {
        "country": "United States",
        "users": [
          {
            "name": "John"
          },
          {
            "name": "Jane"
          },
        ],
      }, 
      {
        "country": "Norway",
        "users": [
          {
            "name": "Ola"
          },
          {
            "name": "Jens"
          },
        ],
      },  
    ];
    
    const result = country_users.reduce((prev, curr) => {
      const users = curr.users.map(user => ({
        name: user.name,
        country: curr.country
      }))
      
      return [
        ...prev,
        ...users,
      ]
    }, [])
    
    console.log(result)

    【讨论】:

      【解决方案3】:

      推送前只需添加属性国家

      var users = [];
      var country_users = [
        {
          "country": "United States",
          "users": [
            {
              "name": "John"
            },
            {
              "name": "Jane"
            },
          ],
        },
        
        {
          "country": "Norway",
          "users": [
            {
              "name": "Ola"
            },
            {
              "name": "Jens"
            },
          ],
        },
        
      ];
      
      // Here I push all users from country_users into a new array called users
      for (let cu = 0; cu < country_users.length; cu++) {
        for (let u = 0; u < country_users[cu].users.length; u++) {
           var newUser = country_users[cu].users[u];
           newUser.country = country_users[cu].country;
           users.push(newUser);
        }
        
        // Do I make a new for loop here to push the country into every object inside users array? How?
      }
      
      console.log(users);

      【讨论】:

        【解决方案4】:

        建议你使用 ES6 语法:

        for(const country of country_users) {
          for(const user of country.users) {
            users.push({
              ...user,
              country : country.country
            })
          }
        }
        

        用户对象是通过使用rest操作符“...”复制的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-22
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-01
          相关资源
          最近更新 更多