javascript:数组循环

javascript: Array looping

本文关键字:循环 数组 javascript      更新时间:2023-09-26

我有两个包含2个数组的an对象。我想以这样一种方式创建循环,即第一个数组的每个元素都被连接到第二个数组的每一个元素。

{'array1':['a','b'],'array2':['1','2']}

它应该创建新的阵列

['a,1':{'prop1':""},'a,2':{'prop1':""},'b,1':{'prop1':""}, 'b,2':{'prop1':""}]

如何在javascript中做到这一点。

你的输出是不可能的,这是无效的语法:["abc": {...}]你想输出的是一个像这样的对象:{"abc": {..}}

您将需要对两个数组进行迭代,一个外部迭代和一个内部迭代:

var input = {'array1':['a','b'],'array2':['1','2']};
var output = {};
// Outer iteration:
// a1 will contain each value from array1 (a, b)
input.array1.forEach(function(a1) {
  // Inner iteration:
  // a2 will contain each value from array2 (1, 2)
  input.array2.forEach(function(a2) {
    // Concatenate the to values (`a,1`, `a,2`, `b,1`, `b,2`) and assign the dummy object:
    output[a1+','+a2] = { prop1: '' };
  });
});
console.log(output); // {"a,1":{"prop1":""},"a,2":{"prop1":""},"b,1":{"prop1":""},"b,2":{"prop1":""}}

这里有一个构建在@dev-null解决方案上的函数。这将以您想要的方式重新构造对象,但不依赖于键的名称或对象中的数组数量。它应该处理任何长度的输入对象,只要其结构相同即可。此外,我确信有一种方法可以优化它,但对于这个例子来说,它似乎足够快了。

var input = {
    'array1':['a','b'],
    'array2':['1','2', '3'],
    'array3':['x','y', 'z']
};
var output = combineObj(input);
console.log(output);
// In: an object of arrays
// Returns restructured object
function combineObj(obj) {
    var allVals = [];
    var locatoins = [0];
    var output = {};
    var keys = Object.keys(obj).sort();
    var counter = 0;
    // combine each individual array into one big array
    keys.forEach(function(objItem, indx){
        obj[objItem].forEach(function(aryItem){
            allVals.push(aryItem);
            counter++;
        });
        locatoins.push(counter);
    });
    // Used in combination with the locations array to track where a new array begins
    // The purpose of this is so items from the same array in input aren't combined
    var iterator = 1;
    for( i=0; i < allVals.length; i++ ){
        if(i == locatoins[iterator]){
            iterator++;
        }
        for( j = 0; j < allVals.length; j++ ){
            if( j >= locatoins[iterator-1] && j < locatoins[iterator] ){
                continue;
            }
            output[allVals[i] + ', ' + allVals[j]] = { prop1: '' };
        }
    }
    return output;
}