簡體   English   中英

如何將對象轉換為對象數組?

[英]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)); 

JSFiddle

假設對象名為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#maplodash#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 ,只需簡單的filtermap就足夠了,但是,如果您願意,可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM