Вставить значение ключа из массива в другой массив в цикле JavaScript

1

Я пытаюсь нажать значение из ключа, который существует в первом массиве. Этот массив состоит из массива country_users который я зациклил на каждом массиве пользователей внутри этого объекта и country_users их в новый массив, называемый users

В этой демонстрации я пытаюсь перенаправить country из country_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);
  • 0
    почему Джон не Джейн и Дженс не Ола? если первое, то олу вместо йенса ...?
  • 1
    @NinaScholz Извините, мой плохой. Я хотел получить одинаковый результат для всех пользователей в массиве country_users.
Теги:
arrays
vue.js

4 ответа

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; }
0

Предложите использовать синтаксис ES6:

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

пользовательский объект копируется с помощью оператора отдыха "..."

0

Просто добавьте страну собственности, прежде чем нажимать

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);
0

Вы можете использовать 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню