javascript动态填充关联数组并获取值

时间:2011-07-31 00:51:44

标签: javascript arrays

我想基于数组构建关联数组,然后获取该关联数组的值。 关联数组的结构如下:

        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。

我们将不胜感激。

4 个答案:

答案 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]])