преобразование объекта в массив с помощью lodash


как я могу преобразовать большая object to array С лодашь?

пример:

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}

// transform to 
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]

спасибо!

9 115

9 ответов:

можно сделать

var arr = _.values(obj);

для документации см. здесь.

_.toArray(obj);

выходы:

[
  {
    "name": "Ivan",
    "id": 12,
    "friends": [
      2,
      44,
      12
    ],
    "works": {
      "books": [],
      "films": []
    }
  },
  {
    "name": "John",
    "id": 22,
    "friends": [
      5,
      31,
      55
    ],
    "works": {
      "books": [],
      "films": []
    }
  }
]"

для меня это работает:

_.map(_.toPairs(data), d => _.fromPairs([d]));

получается

{"a":"b", "c":"d", "e":"f"} 

на

[{"a":"b"}, {"c":"d"}, {"e":"f"}]

Если вы хотите, чтобы ключ (id в этом случае) был сохранен как свойство каждого элемента массива, вы можете сделать

const arr = _(obj) //wrap object so that you can chain lodash methods
            .mapValues((value, id)=>_.merge({}, value, {id})) //attach id to object
            .values() //get the values of the result
            .value() //unwrap array of objects

современное нативное решение, если кто-то заинтересован (спасибо за улучшение Koushik):

const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));

обновление 2017: "объект".значения, лодашь значения и toArray сделать это. И сохранить ключи карта и распространение оператор Играй:

// import { toArray, map } from 'lodash'
const map = _.map

const input = {
  key: {
    value: 'value'
  }
}

const output = map(input, (value, key) => ({
  key,
  ...value
}))

console.log(output)
// >> [{key: 'key', value: 'value'}])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

преобразование объекта в массив с обычный JavaScript(ECMAScript-2016)Object.values:

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[]}},
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[]}}
}

var values = Object.values(obj)

console.log(values);

если вы также хотите сохранить ключи использовать Object.entries и Array#map такой:

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[]}},
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[]}}
}

var values = Object.entries(obj).map(([k, v]) => ({[k]: v}))

console.log(values);

var arr = _.map(obj)

можно использовать (как lodash и underscore) С object кроме того, он будет внутренне обрабатывать этот случай, перебирать каждое значение и ключ с вашим iteratee и, наконец, возвращать массив. Фактически, вы можете использовать его без каких-либо итераций (просто _.map(obj)) если вы просто хотите массив значений. Хорошая часть заключается в том, что, если вам нужна какая-либо трансформация между ними, вы можете сделать это в одном идти.

пример:

var obj = {
    key1: {id: 1, name: 'A'},
    key2: {id: 2, name: 'B'},
    key3: {id: 3, name: 'C'}
};

var array1 = _.map(obj, v=>v);
console.log('Array 1: ', array1);

/*Actually you don't need the callback v=>v if you
are not transforming anything in between, v=>v is default*/

//SO simply you can use
var array2 = _.map(obj);
console.log('Array 2: ', array2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

однако, если вы хотите преобразовать свой объект, вы можете сделать это, даже если вам нужно сохранить ключ, вы можете это сделать ( _.map(obj, (v, k) => {...}) с дополнительным аргументом в map и затем использовать его, как вы хотите.

однако есть и другие решения Vanilla JS для этого (как и каждый lodash решение должно быть чистой JS-версией), например:

  • Object.keys а то map ними к значениям
  • Object.values (в ES-2017)
  • Object.entries а то map каждая пара ключ / значение (в ES-2017)
  • for...in петли и использовать каждый ключи для Фетинга значения

и многое другое. Но так как этот вопрос для lodash (и предполагая, что кто-то уже использует его), то вам не нужно много думать о версии, поддержке методов и обработке ошибок, если они не найдены.

есть и другие решения lodash, такие как _.values (более читаемый для конкретного perpose), или получение пар, а затем карта и так далее. но в случае, если ваш код нуждается в гибкости, что вы можете обновить его в будущем, как вам нужно сохранить keys или преобразование значений немного, то лучшим решением является использование одного _.map как указано в этом ответе. Это будет bt не так сложно в соответствии с читаемостью также.

Если вы хотите, чтобы некоторые пользовательские карты (как и исходный массив.прототип.карте) объекта в массив, вы можете просто использовать _.forEach:

let myObject = {
  key1: "value1",
  key2: "value2",
  // ...
};

let myNewArray = [];

_.forEach(myObject, (value, key) => {
  myNewArray.push({
    someNewKey: key,
    someNewValue: value.toUpperCase() // just an example of new value based on original value
  });
});

// myNewArray => [{ someNewKey: key1, someNewValue: 'VALUE1' }, ... ];

посмотреть lodash doc of _.forEach https://lodash.com/docs/#forEach