使用Underscore转换对象数组

时间:2016-02-02 05:00:30

标签: javascript arrays underscore.js

我试图获取一组对象并挑选出我只需要的数据。例如,下面我只想要name中的idusersoriginalArray属性。

我想出了如何在第一级迭代中执行此操作,但如何对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方法返回列入白名单的值,但如何更改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);

1 个答案:

答案 0 :(得分:2)

另一个地图/选择应用于子数组

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

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