Lodash: как создать массив с новой структурой объекта - PullRequest
0 голосов
/ 06 декабря 2018

Допустим, у меня есть массив:

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'travis', age: 37, active: true}
];

Я хочу создать новый массив:

var users = [
  {person: {item : { user: 'barney', age: 36, active: true }}},
  {person: {item : { user: 'fred',  age: 40, active: false }}},
  {person: {item : { user: 'travis', age: 37, active: true}}}
];

Очевидно, что для создания нового массива используется обходной цикл for, но яЯ использую lodash для манипулирования моими массивами в моем проекте.

Просто удивительно, есть ли решение для lodash для этого.

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Вы также можете сделать это с помощью Array.from, поскольку параметр 2nd является действительной Array.map функцией:

var users = [ { user: 'barney', age: 36, active: true }, { user: 'fred', age: 40, active: false }, { user: 'travis', age: 37, active: true} ];

const result = Array.from(users, i => ({ person: {item: i} }))

console.log(result)
0 голосов
/ 06 декабря 2018

вы можете использовать array.map , который создаст новый массив, и так как вы можете использовать функцию стрелки в одной строке, вы можете избежать возврата, а используя деструктуру es6, вы можете добиться следующим образом.

Я надеюсь, что это решит вашу проблему

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'travis', age: 37, active: true}
];

var newUsers = users.map(o => ({person: {item: o}}))

console.log("new array with inside person and inside item property", newUsers)
0 голосов
/ 06 декабря 2018

Если вы используете Lodash, тогда вы можете использовать _.map

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'travis', age: 37, active: true}
];

var convertedUsers = _.map(users, user => ({person: {item : {user}}}));

console.log(convertedUsers);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

Обратите внимание, что это будет означать, что при этом повторно используются исходные объекты, поэтому изменения в них будут перенесены в отображенный вывод:

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'travis', age: 37, active: true}
];

var convertedUsers = _.map(users, user => ({person: {item : user}}));

users[0].user = 'betty'; //change barney -> betty

//change is reflected in the already mapped output
console.log(convertedUsers[0].person.item.user);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

Если это нежелательно, вы можете создавать новые объекты с таким же содержанием:

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'travis', age: 37, active: true}
];

var convertedUsers = _.map(users, user => ({person: {item : {...user}}})); //note the {...users}

users[0].user = 'betty'; //change the original barney -> betty

//no change in the mapped result
console.log(convertedUsers[0].person.item.user);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

Вы можете сделать то же самое с простым JavaScript и Array # map :

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'travis', age: 37, active: true}
];

var convertedUsersReusingObjects = users.map(user => ({person: {item : user}}));

var convertedUsersWithNewObjects = users.map(user => ({person: {item : {...user}}})) ;

console.log("convertedUsersReusingObjects:",  convertedUsersReusingObjects);

console.log("----------------");


console.log("convertedUsersWithNewObjects:",  convertedUsersWithNewObjects);

console.log("----------------");

users[0].user = 'betty'; //change the original barney -> betty

console.log("reusing objects: ", convertedUsersReusingObjects[0].person.item.user);
console.log("new objects: ",  convertedUsersWithNewObjects[0].person.item.user);
0 голосов
/ 06 декабря 2018

Вы можете использовать Array#map для новой структуры.

var users = [{ user: 'barney', age: 36, active: true }, { user: 'fred',  age: 40, active: false }, { user: 'travis', age: 37, active: true}],
    result = users.map(item => ({ person: { item } }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...