使用下划线转换对象数组

Transform array of objects with Underscore

我正在尝试获取一组对象并挑选出我只需要的数据。例如,下面我只想要 originalArray.

中的 nameidusers 属性

我想出了如何在第一级迭代中做到这一点,但我如何对 users 对象数组做同样的事情?我只想包含下面找到的 allowedUserProps 数组中的值。

https://jsfiddle.net/n8zw47cd/

原始数组

var originalArr = [
    {
      name: 'Obj 1',
      id: 0,
      something: 'else',
      users: [{first_name: 'Joe', last_name: 'Smith'}]
    }, 
    {
      name: 'Obj 2',
      id: 1,
      something: 'else',
      users: [{first_name: 'Jane', last_name: 'Doe'}]
    }, 
];

期望输出

[
    {
      name: 'Obj 1',
      id: 0,
      users: [{first_name: 'Joe'}]
    }, 
    {
      name: 'Obj 2',
      id: 1,
      users: [{first_name: 'Jane'}]
    }, 
];

我正在使用 Underscore 的 pick 方法来 return 列入白名单的值,但是我怎样才能更改 users 对象数组呢?

function changeArray(arr) {
    var allowedProps = ['name', 'id', 'users'];
    var allowedUserProps = ['first_name'];

    return _.map(arr, function(item) {
       return _.pick(item, allowedProps);
    });
}

var transformed = changeArray(originalArr);

对子数组应用另一个map/pick:

function changeArray(arr) {
    var allowedProps = ['name', 'id', 'users'];
    var allowedUserProps = ['first_name'];

    return _.map(arr, function(item) {
        var out = _.pick(item, allowedProps);
        out.users = _.map(out.users, function(usersItem) {
            return _.pick(usersItem, allowedUserProps);
        });
        return out;
    });
}

与外部数组的原理相同,但每个子数组元素一次。这将为您提供所需的输出。