[英]How to transform object into array of objects?
我想將其轉換為基於鍵數組排序的對象數組:
{
tom: 11,
jim: 22,
jay: 13
}
輸入->輸出示例:
['jim', 'tom', 'kim', 'jay']
-> [{jim: 22}, {tom: 11}, {jay: 13}]
['may', 'jay', 'tom', 'jim']
-> [{jay: 13}, {tom: 11}, {jim: 22}]
我該怎么做? 我寧願一個單行lodash解決方案。
對於它的價值,這是一個執行所需功能的JS函數。
function transform(targetObj, keyArray) {
let resultArray = [];
// Sanity (may want to throw error here)
if (!targetObj || !keyArray) { return resultArray; }
for (let i = 0; i < keyArray.length; i++) {
if (!targetObj.hasOwnProperty(keyArray[i])) { continue; }
let item = {};
item[keyArray[i]] = targetObj[keyArray[i]];
resultArray.push(item);
}
return resultArray;
}
測驗
let obj = { tom: 11, jim: 22, jay: 13 };
let input1 = ['jim', 'tom', 'kim', 'jay'];
let input2 = ['may', 'jay', 'tom', 'jim'];
let result1 = transform(obj, input1);
console.log(JSON.stringify(result1));
let result2 = transform(obj, input2);
console.log(JSON.stringify(result2));
假設對象名為obj
,要查找的鍵列表名為keys
:
_.zip([keys, keys.map(x => obj[x])]).filter(([k, v]) => v).map(x => _.fromPairs([x]))
或者,如果您不關心訂單,那么還有另一種方法:
_.toPairs(obj).filter(([k, v]) => _.include(keys, k)).map(x => _.fromPairs([x]))
單行lodash解決方案是使用lodash#toPairs
將對象轉換為鍵-值對數組, lodash#chunk
將每個對與另一個數組包裝在一起,以准備使用以下各項將每個項映射為對象lodash#map
和lodash#fromPairs
iteratee。
var result = _(data).toPairs().chunk().map(_.fromPairs).value();
var data = { tom: 11, jim: 22, jay: 13 }; var result = _(data).toPairs().chunk().map(_.fromPairs).value(); console.log(result);
.as-console-wrapper{min-height:100%;top:0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Vanilla JS ES6解決方案是使用Object#keys
從對象獲取Object#keys
數組,使用Array#map
映射每個鍵以關聯每個鍵以形成對象數組。 我們使用ES6計算屬性名稱功能將鍵直接關聯到匿名對象中。
var result = Object.keys(data).map(key => ({ [key]: data[key] }));
var data = { tom: 11, jim: 22, jay: 13 }; var result = Object.keys(data).map(key => ({ [key]: data[key] })); console.log(result);
.as-console-wrapper{min-height:100%;top:0}
如果您使用的瀏覽器不支持ES6,則可以將上述解決方案簡單地轉換為:
var result = Object.keys(data).map(function(key) {
var object = {};
object[key] = data[key];
return object;
});
var data = { tom: 11, jim: 22, jay: 13 }; var result = Object.keys(data).map(function(key) { var object = {}; object[key] = data[key]; return object; }); console.log(result);
.as-console-wrapper{min-height:100%;top:0}
基本上,對於一個線性解決方案,您不需要lodash
,只需簡單的filter
和map
就足夠了,但是,如果您願意,可以使用lodash
。
//this is your source object
var keys = {
tom: 11,
jim: 22,
jay: 13
}
現在,假設您有2個(一些)數組
var input1 = ['jim', 'tom', 'kim', 'jay'];
var input2 = ['may', 'jay', 'tom', 'jim'];
現在我們開始:
//for first input
input1.filter(s=>keys[s]).map(s=> ({[s]: keys[s]}));
//for secondinput
input2.filter(s=>keys[s]).map(s=> ({[s]: keys[s]}));
這是適合您的代碼段:
var keys = { tom: 11, jim: 22, jay: 13 } var input1 = ['jim', 'tom', 'kim', 'jay']; var input2 = ['may', 'jay', 'tom', 'jim']; var output1 = input1.filter(s=>keys[s]).map(s=> ({[s]: keys[s]})); var output2 = input2.filter(s=>keys [s]).map(s=> ({[s]: keys[s]})); console.log("Output1: ", JSON.stringify(output1)); console.log("Output2: ", JSON.stringify(output2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.