简体   繁体   English

使用 Lodash 修改数组中的键

[英]Modify Keys in Array with Lodash

I'm attempting to modify an array of objects with lodash, and struggling a bit.我正在尝试使用 lodash 修改一组对象,并且有点挣扎。 I would like to take the array below and change the keys in the objects.我想获取下面的数组并更改对象中的键。

Here is my source array:这是我的源数组:

[
    {
        "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"
            }
        ]
    },
    ...
    ]

I would like this to result in:我希望这导致:

[
    {
        "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"
            }
        ]
    },
    ...
    ]

Note that the first two keys are renamed.请注意,前两个键已重命名。 I know I can use _.mapKeys to modify the keys, however I'm not sure how to iterate the array in the best way to do this.我知道我可以使用_.mapKeys来修改键,但是我不确定如何以最好的方式迭代数组来做到这一点。

Any suggestions would be much appreciated.任何建议将不胜感激。

Iterate using Array#map (or lodash's _.map() ), and use Object#assign (or _.assign() ) to generate a new object with the change key.使用Array#map (或 lodash 的_.map() )进行迭代,并使用Object#assign (或_.assign() )生成具有更改键的新对象。

Assign will meld an object with new keys with the respective values from the original object, and the original object without the keys you want to replace using _.omit() .分配会将具有新键的对象与来自原始对象的相应值和没有要使用_.omit()替换的键的原始对象_.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>

Another option is to use _.mapKeys() to change the key names:另一种选择是使用_.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>

I prefer not to change the original data so this is what I would do:我不想更改原始数据,所以这就是我要做的:

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

You can use _.map and create a new object, change the keys based on the condition and return the new object.您可以使用_.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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM