#arrays #lodash
#массивы #Lodash
Вопрос:
У меня есть следующий массив:
[
{
"name": "ABC",
"type": "iPhone",
"sessions": "3.0"
},
{
"name": "ABC",
"type": "Android",
"sessions": "25.0"
},
{
"name": "ABC",
"type": "Windows",
"sessions": "3.0"
},
{
"name": "XYZ",
"type": "iPhone",
"sessions": "1.0"
},
{
"name": "XYZ",
"type": "Android",
"sessions": "11.0"
},
{
"name": "XYZ",
"type": "Windows",
"sessions": "15.0"
},
{
"name": "XYZ",
"type": "Outlook",
"sessions": "10.0"
},
{
"name": "DEF",
"type": "Windows",
"sessions": "10.0"
},
{
"name": "GHI",
"type": "iPhone",
"sessions": "10.0"
}
]
Я хотел бы преобразовать это в массив объектов следующим образом, используя Lodash:
[
{
"name": "ABC",
"iPhone": "3.0",
"Android": "25.0",
"Windows": "3.0",
"Outlook": ""
},
{
"name": "XYZ",
"iPhone": "1.0",
"Android": "11.0",
"Windows": "15.0",
"Outlook": "10.0"
},
{
"name": "DEF",
"iPhone": "",
"Android": "",
"Windows": "10.0",
"Outlook": ""
},
{
"name": "GHI",
"iPhone": "10.0",
"Android": "",
"Windows": "",
"Outlook": ""
}
]
В основном свойство «name» должно использоваться в качестве ключа для объединения свойств в объект. Есть какой-нибудь краткий способ сделать это с Lodash?
Ответ №1:
Вы можете использовать Lodash _.transform()
:
var arr = [{"name":"ABC","type":"iPhone","sessions":"3.0"},{"name":"ABC","type":"Android","sessions":"25.0"},{"name":"ABC","type":"Windows","sessions":"3.0"},{"name":"XYZ","type":"iPhone","sessions":"1.0"},{"name":"XYZ","type":"Android","sessions":"11.0"},{"name":"XYZ","type":"Windows","sessions":"15.0"},{"name":"XYZ","type":"Outlook","sessions":"10.0"},{"name":"DEF","type":"Windows","sessions":"10.0"},{"name":"GHI","type":"iPhone","sessions":"10.0"}];
var result = _.transform(arr, function(products, item) {
var product = products[item.name] = products[item.name] || {
name: item.name,
iPhone: "",
Android: "",
Windows: "",
Outlook: ""
};
product[item.type] = item.sessions;
return products;
}, {});
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
Ответ №2:
Другим решением может быть:
var f = [{
"name": "ABC",
"type": "iPhone",
"sessions": "3.0"
}, {
"name": "ABC",
"type": "Android",
"sessions": "25.0"
}, {
"name": "ABC",
"type": "Windows",
"sessions": "3.0"
}, {
"name": "XYZ",
"type": "iPhone",
"sessions": "1.0"
}, {
"name": "XYZ",
"type": "Android",
"sessions": "11.0"
}, {
"name": "XYZ",
"type": "Windows",
"sessions": "15.0"
}, {
"name": "XYZ",
"type": "Outlook",
"sessions": "10.0"
}, {
"name": "DEF",
"type": "Windows",
"sessions": "10.0"
}, {
"name": "GHI",
"type": "iPhone",
"sessions": "10.0"
}];
var def = {
"name": "",
"iPhone": "",
"Android": "",
"Windows": "",
"Outlook": ""
};
function updateMemo(memo, obj) {
memo[obj.name] = memo[obj.name] || _.extend({}, def, {name: obj.name});
memo[obj.name][obj.type] = obj.sessions;
return memo;
}
console.log(_.values(_.reduce(f, updateMemo, {})));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
Он состоит из выполнения сокращения массива, хранящего значения в промежуточном объекте. Сохраненные значения соответствуют структуре по умолчанию. После создания массива возвращаются только значения, чтобы получить ожидаемый результат.
Надеюсь, это поможет.
Ответ №3:
Это возможно с помощью метода Lodash mapKeys
, но ваше значение должно быть объектом, а не примитивным значением.
let orig = {" a ":{rate: 1}, " b ":{rate: 2}};
let result = _.mapKeys(orig, (value, key)=> {
value.rate = value.rate 1
return key.trim()
})
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>