Javascript-嵌套循环和索引

Javascript-嵌套循环和索引,javascript,arrays,Javascript,Arrays,我正在尝试构建一个如下所示的阵列: [ [{"name":"Mercury","index":0}], [{"name":"Mercury","index":1},{"name":"Venus","index":1}], [{"name":"Mercury","index":2},{"name":"Venus","index":2},{"name":"Earth","index":2}], ... ] 每个元素都是前一个对象和新对象的串联,所有索引都会更新为最新值(例如Mercury的索

我正在尝试构建一个如下所示的阵列:

[
 [{"name":"Mercury","index":0}],
 [{"name":"Mercury","index":1},{"name":"Venus","index":1}],
 [{"name":"Mercury","index":2},{"name":"Venus","index":2},{"name":"Earth","index":2}],
...
]
每个元素都是前一个对象和新对象的串联,所有索引都会更新为最新值(例如Mercury的索引为0,然后为1,等等)。 我已尝试使用以下代码构建此阵列:

var b = [];
var buffer = [];
var names = ["Mercury","Venus","Earth"]
for (k=0;k<3;k++){

    // This array is necessary because with real data there are multiple elements for each k
    var a = [{"name":names[k],"index":0}]; 

    buffer = buffer.concat(a);

    // This is where the index of all the elements currently in the 
    // buffer (should) get(s) updated to the current k 
    for (n=0;n<buffer.length;n++){
        buffer[n].index = k;
    }

    // Add the buffer to the final array
    b.push(buffer);

}
console.log(b);
var b=[];
var缓冲区=[];
变量名称=[“水星”、“金星”、“地球”]

对于(k=0;k这是因为内部数组中的每个对象实际上都是与前一个外部数组项中存储的对象完全相同的对象-您只存储对该对象的引用,而不是副本。当您更新对象中的
索引时,您会到处更新它

要解决此问题,您需要在每个内部迭代中创建新对象,或使用对象复制功能,如ES6的
对象.assign
、jQuery的
$.extend
或下划线的
.clone

这是一个使用第一种方法的版本,它还使用两个嵌套的
.map
调用来生成内部(可变长度)数组和外部数组:

var names = ["Mercury","Venus","Earth"];

var b = names.map(function(_, index, a) {
    return a.slice(0, index + 1).map(function(name) {
        return {name: name, index: index};
    });
});
或在ES6中:

var names = ["Mercury","Venus","Earth"];
var b = names.map((_, index, a) => a.slice(0, index + 1).map(name => ({name, index})));

发生这种情况的原因是,内部数组中的每个对象实际上都是与前一个外部数组项中存储的对象完全相同的对象-您只存储对该对象的引用,而不是副本。当您更新对象中的
索引时,您会到处更新它

要解决此问题,您需要在每个内部迭代中创建新对象,或使用对象复制功能,如ES6的
对象.assign
、jQuery的
$.extend
或下划线的
.clone

这是一个使用第一种方法的版本,它还使用两个嵌套的
.map
调用来生成内部(可变长度)数组和外部数组:

var names = ["Mercury","Venus","Earth"];

var b = names.map(function(_, index, a) {
    return a.slice(0, index + 1).map(function(name) {
        return {name: name, index: index};
    });
});
或在ES6中:

var names = ["Mercury","Venus","Earth"];
var b = names.map((_, index, a) => a.slice(0, index + 1).map(name => ({name, index})));
试试这个:

var name=[“水星”、“金星”、“地球”];
var结果=[];
对于(var i=0;i尝试以下方法:

var name=[“水星”、“金星”、“地球”];
var结果=[];

对于(var i=0;i请尝试以下简单脚本:

var b = [];
var names = ["Mercury","Venus","Earth"];
for(var pos = 0; pos < names.length; pos++) {
    var current = [];
    for(var x = 0; x < pos+1; x++) {
        current.push({"name": names[x], "index": pos});
    }
    b.push(current);
}
var b=[];
变量名称=[“水星”、“金星”、“地球”];
对于(var pos=0;pos
试试这个简单的脚本:

var b = [];
var names = ["Mercury","Venus","Earth"];
for(var pos = 0; pos < names.length; pos++) {
    var current = [];
    for(var x = 0; x < pos+1; x++) {
        current.push({"name": names[x], "index": pos});
    }
    b.push(current);
}
var b=[];
变量名称=[“水星”、“金星”、“地球”];
对于(var pos=0;pos
例如,您存储了几个不同的数组(由于
concat
返回了一个新数组),但每个数组都包含对对象的引用(而不是对象的副本)。@Alnitak:谢谢,第一个解决方案按预期工作。不过,我不熟悉.map()。您能解释一下“\u”的含义吗在第一个回调函数中?@T.J.Crowder:感谢您的澄清,我想因为我正在创建一个新数组,所以所有内容都被复制了。@GuitarExtended
。map
是将一个数组转换为另一个数组的规范函数。我使用
作为惯例来指示未使用的参数。Re:数组本身,只复制(不可见)引用。例如,您正在存储几个不同的数组(由于
concat
返回一个新数组),但每个数组都包含对对象的引用(而不是对象的副本)。@Alnitak:谢谢,第一个解决方案按预期工作。我不熟悉.map()尽管如此,你能解释一下“uu”的意思吗在第一个回调函数中?@T.J.Crowder:感谢您的澄清,我想因为我正在创建一个新数组,所以所有内容都被复制了。@GuitarExtended
。map
是将一个数组转换为另一个数组的规范函数。我使用
作为惯例来指示未使用的参数。Re:数组本身,只有(不可见)引用被复制。我必须问-为什么需要这种特殊格式的数据?
.index
属性正好等于外部数组偏移量加1。在我使用的数据中,index被任意年份替换,而任意年份不能从数组长度推断出来。另外,我想了解这种看似奇怪的行为。…我必须问-为什么需要这种特殊格式的数据?
.index
属性正好等于外部数组偏移量加1。在我使用的数据中,index被任意年份替换,而任意年份不能从数组长度推断出来。另外,我想了解这种看似奇怪的行为…这段代码是语义与Rajesh 10分钟前的答案在语义上相同该代码与Rajesh 10分钟前的答案在语义上相同