Значения карты Лодаша во вложенном массиве - PullRequest
0 голосов
/ 16 января 2019

У меня есть данные такого рода, которые мы обычно получаем из API, и я впервые использую lodash.

{
  "_id": "93866",
  "stats": [
    {
      "points": 86,
      "pos": 11,
      "createdAt": "2019-01-16T10:13:40.650Z",
      "updatedAt": "2019-01-16T10:13:40.825Z"
    },
    {
      "points": 79,
      "pos": 26,
      "createdAt": "2019-01-16T10:13:40.650Z",
      "updatedAt": "2019-01-16T10:13:40.825Z"
    },
    {
      "points": 64,
      "pos": 39,
      "createdAt": "2019-01-16T10:13:40.650Z",
      "updatedAt": "2019-01-16T10:13:40.825Z"
    }
  ]
}

Все, чего я хочу, это добиться, как это

[ [ 86, 11 ], [ 79, 26 ], [ 64, 39 ] ]

Я могу просто сделать это естественным путем, выполнив это,

var result = data.stats.map(o => [o.points, o.pos])
// => [ [ 86, 11 ], [ 79, 26 ], [ 64, 39 ] ]

, который дает ожидаемый результат, но среда, в которой я работаю, зависит от использования lodash.

Я до сих пор пробовал _.map(data.stats, 'points'), но я не уверен, как мне добиться этого, как это [ [ 86, 11 ], [ 79, 26 ], [ 64, 39 ] ]

Так как это сделать?

Ответы [ 4 ]

0 голосов
/ 16 января 2019

Вы можете использовать lodash's _.at() с _.map():

const data = {"_id":"93866","stats":[{"points":86,"pos":11,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"},{"points":79,"pos":26,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"},{"points":64,"pos":39,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"}]};

const result = _.map(data.stats, o => _.at(o, ['points', 'pos']));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Вы также можете использовать lodash / fp версии _.map() и _.at() для создания функции:

const data = {"_id":"93866","stats":[{"points":86,"pos":11,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"},{"points":79,"pos":26,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"},{"points":64,"pos":39,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"}]};

const fn = _.map(_.at(['points', 'pos']));

const result = fn(data.stats);

console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 16 января 2019

Вот это:

_.map(data.stats, obj => [ obj.points, obj.pos ])

Редактировать: @ Хасан Имам сделал интересный ответ, используя разрушающий объект

0 голосов
/ 16 января 2019

Вы можете использовать object#destructring в функции обратного вызова.

let data = {"_id":"93866","stats":[{"points":86,"pos":11,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"},{"points":79,"pos":26,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"},{"points":64,"pos":39,"createdAt":"2019-01-16T10:13:40.650Z","updatedAt":"2019-01-16T10:13:40.825Z"}]},
    result = _.map(data.stats, ({points, pos}) => [points,pos]);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 16 января 2019

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

var result = _.map(data.stats, o => [o.points, o.pos]);

Как видите, я заменил второй параметр на _.map (который был 'points') на функцию, используемую в вашей нативной версии.

...