如何将对象转换为对象数组?

问题描述 投票:0回答:4

我想将其转换为基于键数组排序的对象数组:

{
  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解决方案。

javascript arrays sorting object lodash
4个回答
0
投票

对于它的价值,这是一个执行你想要的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


0
投票

假设该对象名为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]))

0
投票

单行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从对象获取一组键,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}

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));
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.