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

时间:2017-09-04 22:07:02

标签: javascript arrays sorting object lodash

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

或者,如果您不关心订单,还有另一种方式:

x <- as.numeric (readline(prompt="How many concs?: ")) 
y <- paste("conc",1:x)

print(paste("enter", x," numbers separated return: "))
a <- scan(nmax=x,what=double())
df =  data.frame(conc=y,value=a)

答案 2 :(得分:0)

单线程lodash解决方案是使用lodash#toPairs将对象转换为键值对数组lodash#chunk以将每对与另一个数组包装起来作为将每个项映射到的准备使用lodash#map lodash#fromPairs iteratee将对形成对象。

var result = _(data).toPairs().chunk().map(_.fromPairs).value();

&#13;
&#13;
var data = {
  tom: 11,
  jim: 22,
  jay: 13
};

var result = _(data).toPairs().chunk().map(_.fromPairs).value();
  
console.log(result);
&#13;
.as-console-wrapper{min-height:100%;top:0}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

Vanilla JS ES6解决方案是使用Object#keys从对象Array#map获取一组键,以映射每个键以关联每个键以形成对象数组。我们使用ES6计算属性名称功能将键直接关联到匿名对象。

var result = Object.keys(data).map(key => ({ [key]: data[key] }));

&#13;
&#13;
var data = {
  tom: 11,
  jim: 22,
  jay: 13
};

var result = Object.keys(data).map(key => ({ [key]: data[key] }));
  
console.log(result);
&#13;
.as-console-wrapper{min-height:100%;top:0}
&#13;
&#13;
&#13;

如果您使用的浏览器不支持ES6,那么您只需将上述解决方案转换为:

var result = Object.keys(data).map(function(key) {
  var object = {};
  object[key] = data[key];
  return object;
});

&#13;
&#13;
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);
&#13;
.as-console-wrapper{min-height:100%;top:0}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

基本上对于单线程解决方案,您不需要lodash,只需简单filtermap即可,但如果您愿意,可以使用{{ 1}}。

lodash

现在,让我们假设您有2个(某些)数组

//this is your source object 
var keys = {
  tom: 11,
  jim: 22,
  jay: 13
}

我们走了:

var input1 = ['jim', 'tom', 'kim', 'jay'];
var input2 = ['may', 'jay', 'tom', 'jim'];

以下是适合您的工作片段:

&#13;
&#13;
//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]}));
&#13;
&#13;
&#13;