我想基于数组构建关联数组,然后获取该关联数组的值。 关联数组的结构如下:
var myAssociativeArr = new Array();
myAssociativeArr = [
{ id:'1',
lname:'doe',
fname:'john'
},
{ id:'2',
lname:'smith',
fname:'john'
}
]
我有三个长度相同的数组,我将构建这个关联数组,即id,lname和fname数组。
for(var i=0; idArray.length;i++)
{
myAssociativeArr [id]=idArray[i];
myAssociativeArr [lname]=lnameArray[i];
myAssociativeArr [fname]=fnameArray[i];
}
请告诉我上述方法是否正确,如果不是如何构建此数组,以及如何通过循环获取此数组的valeus。
我们将不胜感激。
答案 0 :(得分:18)
你非常接近。首先,如果你想使用数组下标表示法,你必须自己传递密钥(在你的情况下是字符串,像这样):
var myAssociativeArr = [];
for (var i=0; i < idArray.length; i++) {
var newElement = {};
newElement['id'] = idArray[i];
newElement['lname'] = lnameArray[i];
newElement['fname'] = fnameArray[i];
myAssociativeArr.push(newElement);
}
如果键名是已知字符串,则通常最好使用完全等效的对象属性表示法:
var myAssociativeArr = [];
for (var i=0; i < idArray.length; i++) {
var newElement = {};
newElement.id = idArray[i];
newElement.lname = lnameArray[i];
newElement.fname = fnameArray[i];
myAssociativeArr.push(newElement);
}
使用对象文字可以更简洁,就像在示例输出中一样:
var myAssociativeArr = [];
for (var i=0; i < idArray.length; i++) {
myAssociativeArr.push({
id: idArray[i],
lname: lnameArray[i],
fname: fnameArray[i]
});
}
编辑:固定循环索引不是无限的。
您以与编写元素相同的方式阅读元素:myAssociativeArr[i]['id']
等,或myAssociativeArr[i].id
等。
对于按ID查找,最好为此构建一个对象。
var myObject = {};
for (var i=0; i < idArray.length; i++) {
myObject[idArray[i]] = {
id: idArray[i],
lname: lnameArray[i],
fname: fnameArray[i]
};
}
要查找:
myObject['2'] // => { id: '2', ... }
答案 1 :(得分:4)
不太好,试试这个:
for(var i=0; idArray.length; i++)
{
myAssociativeArr[i] = {
id: idArray[i],
lname: lnameArray[i],
fname: fnameArray[i]
};
}
获取第5个元素的id:myAossociativeArr[i]['id']
,我相信你可以从这里找出其余部分;)
答案 2 :(得分:1)
for(var i=0; idArray.length;i++)
{
myAssociativeArr [i][id]=idArray[i];
myAssociativeArr [i][lname]=lnameArray[i];
myAssociativeArr [i][fname]=fnameArray[i];
}
答案 3 :(得分:0)
八年前,使用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]])