使用 Lodash 修改数组中的键

5
我将尝试使用lodash修改一个对象数组,但有些困难。我想要改变下面数组中对象的键名。
以下是源数组:
[
    {
        "id": "AD",
        "name": "Andorra",
        "currency": "EUR",
        "timezone": "Europe/Andorra",
        "links": [
            {
                "rel": "self",
                "href": "http://localhost:8000/api/countries/AD"
            },
            {
                "rel": "country.currency",
                "href": "http://localhost:8000/api/currencies/EUR"
            }
        ]
    },
    {
        "id": "AE",
        "name": "United Arab Emirates",
        "currency": "AED",
        "timezone": "Asia/Dubai",
        "links": [
            {
                "rel": "self",
                "href": "http://localhost:8000/api/countries/AE"
            },
            {
                "rel": "country.currency",
                "href": "http://localhost:8000/api/currencies/AED"
            }
        ]
    },
    ...
    ]

我希望这能有以下结果:
[
    {
        "value": "AD",
        "title": "Andorra",
        "currency": "EUR",
        "timezone": "Europe/Andorra",
        "links": [
            {
                "rel": "self",
                "href": "http://localhost:8000/api/countries/AD"
            },
            {
                "rel": "country.currency",
                "href": "http://localhost:8000/api/currencies/EUR"
            }
        ]
    },
    {
        "value": "AE",
        "title": "United Arab Emirates",
        "currency": "AED",
        "timezone": "Asia/Dubai",
        "links": [
            {
                "rel": "self",
                "href": "http://localhost:8000/api/countries/AE"
            },
            {
                "rel": "country.currency",
                "href": "http://localhost:8000/api/currencies/AED"
            }
        ]
    },
    ...
    ]

请注意,前两个键已被重命名。我知道可以使用_.mapKeys修改键,但是我不确定如何以最好的方式迭代数组来完成此操作。
非常感谢任何建议。

使用 map 进行迭代,并在每次迭代中运行 mapKeys - Dominik
非常好的建议,谢谢大家。 - zag2010
3个回答

5
使用Array#map(或lodash的_.map())进行迭代,并使用Object#assign(或_.assign())生成一个新对象,其中包含更改键。Assign将使用_.omit()将具有新键的对象与原始对象中相应值合并,并删除您想要替换的键。

var data = [{"id":"AD","name":"Andorra","currency":"EUR","timezone":"Europe/Andorra","links":[{"rel":"self","href":"http://localhost:8000/api/countries/AD"},{"rel":"country.currency","href":"http://localhost:8000/api/currencies/EUR"}]},{"id":"AE","name":"United Arab Emirates","currency":"AED","timezone":"Asia/Dubai","links":[{"rel":"self","href":"http://localhost:8000/api/countries/AE"},{"rel":"country.currency","href":"http://localhost:8000/api/currencies/AED"}]}];

var result = data.map(function(o) {
  return Object.assign({
    value: o.id,
    title: o.name
  }, _.omit(o, 'id', 'name'));
});

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

另一种选择是使用 _.mapKeys() 来更改键名:

var data = [{"id":"AD","name":"Andorra","currency":"EUR","timezone":"Europe/Andorra","links":[{"rel":"self","href":"http://localhost:8000/api/countries/AD"},{"rel":"country.currency","href":"http://localhost:8000/api/currencies/EUR"}]},{"id":"AE","name":"United Arab Emirates","currency":"AED","timezone":"Asia/Dubai","links":[{"rel":"self","href":"http://localhost:8000/api/countries/AE"},{"rel":"country.currency","href":"http://localhost:8000/api/currencies/AED"}]}];

var keys = { id: 'value', name: 'title' };

var result = data.map(function(o) {
  return _.mapKeys(o, function(v, k) {
    return k in keys ? keys[k] : k;
  });
});

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


2
我更喜欢不改变原始数据,因此我会这样做:
const thing = [{id:"AD",name:"Andorra",currency:"EUR",timezone:"Europe/Andorra",links:[{rel:"self",href:"http://localhost:8000/api/countries/AD"},{rel:"country.currency",href:"http://localhost:8000/api/currencies/EUR"}]},{id:"AE",name:"United Arab Emirates",currency:"AED",timezone:"Asia/Dubai",links:[{rel:"self",href:"http://localhost:8000/api/countries/AE"},{rel:"country.currency",href:"http://localhost:8000/api/currencies/AED"}]}];

const newThing = [];

thing.map( item => {
    newThing.push(
        _.mapKeys( item, ( value, key ) => {
            let newKey = key;
            if( key === 'id' ) {
                newKey = 'value';
            }

            if( key === 'name' ) {
                newKey = 'title';
            }

            return newKey;
        })
    )
});

console.log( newThing );

1
为什么要定义一个新的列表(newThing)?map返回一个新的列表本身。 - Phoenix

1
你可以使用_.map来创建一个新对象,根据条件更改键并返回新对象。

var obj = [{
  "id": "AD",
  "name": "Andorra",
  "currency": "EUR",
  "timezone": "Europe/Andorra",
  "links": [{
    "rel": "self",
    "href": "http://localhost:8000/api/countries/AD"
  }, {
    "rel": "country.currency",
    "href": "http://localhost:8000/api/currencies/EUR"
  }]
}, {
  "id": "AE",
  "name": "United Arab Emirates",
  "currency": "AED",
  "timezone": "Asia/Dubai",
  "links": [{
    "rel": "self",
    "href": "http://localhost:8000/api/countries/AE"
  }, {
    "rel": "country.currency",
    "href": "http://localhost:8000/api/currencies/AED"
  }]
}];

var updatedObj = _.map(obj, function(currObj, index) {
    var newObj = {};
    
    Object.keys(currObj).forEach(function(key) {
        if(key === 'id') {
          newObj.value = currObj[key];
       } else if(key === 'name') {
           newObj.name = currObj[key];
        } else {
           newObj[key] = currObj[key];
        }
    });
    return newObj;
});

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接