Lodash:与值对象内部属性交换键

时间:2018-07-06 12:48:37

标签: javascript lodash

我得到了以下JSON响应:

users: {
    1: {
        name: "John",
        email: "john@test.com",
        id: 1,
        place: "NY"
    },
    2: {
        name: "Alex",
        email: "alex@test.com",
        id: 2,
        place: "FL"
    },
    3: {
        name: "Tony",
        email: "tony@test.com",
        id: 3,
        place: "TX"
    }
    .
    .
    .
    .
    .
    .
}

我想从内部对象值将ID密钥与电子邮件密钥交换为以下格式。

users: {
    "john@test.com": {
        name: "John",
        email: "john@test.com",
        id: 1,
        place: "NY"
    },
}

我正在使用下面的lodash代码来使其正常工作:

_.keyBy(_.values(data), 'email');

有没有更好的方法可以用lodash处理它?我是lodash的新手,我想了解代码是否可以进一步重构。

2 个答案:

答案 0 :(得分:2)

如果您正在寻找Vanilla JavaScript解决方案,则可以这样使用array#reduce

users =  {
    1: {
        name: "John",
        email: "john@test.com",
        id: 1,
        place: "NY"
    },
    2: {
        name: "Alex",
        email: "alex@test.com",
        id: 2,
        place: "FL"
    },
    3: {
        name: "Tony",
        email: "tony@test.com",
        id: 3,
        place: "TX"
    }
  }

let newUsers = Object.keys(users).reduce((obj, key) => {
  obj[users[key].email] = users[key];
  return obj;
}, {});

console.log(newUsers);

答案 1 :(得分:2)

请参见_.keyBy()接受集合(数组或对象),您可以跳过_.values()调用:

const users = {"1":{"name":"John","email":"john@test.com","id":1,"place":"NY"},"2":{"name":"Alex","email":"alex@test.com","id":2,"place":"FL"},"3":{"name":"Tony","email":"tony@test.com","id":3,"place":"TX"}};

const result = _.keyBy(users, 'email');

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