我想将其转换为基于键数组排序的对象数组:
{
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
从对象获取一组键,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));