八年后,使用ECMAScript 2015,我们可以通过以下方式解决这个问题:
let assocArr = idArray
.map(x=>{ return {id: x}})
.map((x,index) => Object.assign({lname: lname[index]}, x))
.map((x,index) =>Object.assign({fname: fname[index]}, x) )
.reduce((assoc,obj) => {let target = {};target[obj.id] = obj; return Object.assign(target,assoc) }, {})
或者仅使用reduce:
let assocArr = idArray.reduce((assoc, x, index) => {
let target = {};
target[x] = { id: x, lname: lname[index], fname: fname[index] };
return Object.assign(target, assoc);
}, {});
如果有需要的话,一个更灵活的函数可以做上述的事情。
function glue(properties) {
let propsArrays = Object.entries(properties);
let lookUp = properties[properties.lookUpKey];
let propertyArrays = propsArrays.filter(
([key, value]) => key !== "lookUpKey"
);
return propertyArrays.reduce(
(assoc, props, index) => {
let [key, values] = [...props];
return values.reduce((assoc, prop, j) => {
let target = {};
target[key] = prop;
assoc[lookUp[j]] = Object.assign(target, assoc[lookUp[j]]);
return assoc;
}, assoc);
},
lookUp.reduce((assoc, id) => {
assoc[id] = {};
return assoc;
}, {})
);
}
你可以给它一个对象,例如
var properties = {id: idArray, lname: lname, fname: fname, lookUpKey: 'id'}
基于对象的属性名称以及查找数组的键,它将把这些属性作为对象粘合到一个数组中。该函数会将属性对象转换为一组键值对的数组形式:
let propsArrays = Object.entries(properties)
然后它提取lookUp键和实际属性,将它们粘合到各自的数组中:
let lookUp = properties[properties.lookUpKey]
let propertyArrays = propsArrays.filter(([key, value]) => key !== "lookUpKey")
然后,它使用嵌套的
reduce
来将属性处理成具有正确属性的对象数组。请注意:
lookUp.reduce((assoc, id) => {
assoc[id] = {};
return assoc;
}, {})
使用查找数组中的值作为键/属性,初始化最外层的reduce
对象。与这些键相关联的值一开始只是空对象。然后,最内层的reduce
将使用以下方法将适当的属性合并到这些对象中:
assoc[lookUp[j]] = Object.assign(target, assoc[lookUp[j]])
id
的值。类似于:在 for 循环中使用myObject[idArray[i]] = { id: .... };
,并在此之前初始化一个空对象{}
。然后您可以在常数时间内按 ID 查找对象。答案已更新以反映此内容。 - Jeremy Roman