创建多个对象数组

3
为了一个我正在编写的实验,我必须制作下面六种类型的列表。
var list1 = [];
var enc_len_1 = pregenerated_faces[1].encoding_faces.length;
var rec_len_1 = pregenerated_faces[1].recall_faces.length; 

for (var i = 0; i < enc_len_1; i++){
    var obj_encode = { 
        'encode': pregenerated_faces[1].encoding_faces[i]
    };
    list1.push(obj_encode);
};

for (var i = 0; i < rec_len_1; i++){
  var obj_recall = { 
      'reacall': pregenerated_faces[1].recall_faces[i]
  };
  list1.push(obj_recall);
};


每个列表都是这样的: list = [{encode: ...jpg}, {encode: ...jpg}..., {recall: ...jpg}, {recall:...jpg}...]
有没有更加聪明的方式来创建六个这样的列表而不必写六次冗余代码? 还有,pregenerated_faces是一个包含所有编码和回忆人脸图像字符串的.json对象数组。

你能提供一个代码块来展示你想要那个函数如何实际工作吗?比如一个对你有用的虚拟函数? - tarun jain
这不是一个函数,而是一个列表变量,我将在JsPsych中将其用作时间轴变量。在下面的代码中,我将遍历上面创建的列表。var trial1 = { timeline: [generateListStart, displayList, distractor, recognitionTest], timeline_variables: list1 } - JadeHippo
是的,您想创建6个变量列表,而不必再次编写整个代码...我正在考虑将创建列表代码分离到一个函数中,这样您就可以使用给定的定义拥有N个列表。 - tarun jain
这是一个好主意,但我认为可能会很困难,因为列表的数量在我通过Python创建JSON数组时是“固定的”;在这个脚本中,我决定要创建多少个列表,在这种情况下是六个。但一旦我设置了它,列表的数量就无法更改...或者可以吗?也许可以通过在JSON文件中创建一个字段,将有关创建多少个列表的信息从Python转换为JavaScript。 - JadeHippo
我希望你要迭代 pregenerated_faces 而不是 encoding_faces - tarun jain
2个回答

1
var lists = [];
for (var face of pregenerated_faces) { //should loop 6 time
  var list = [];
  face .encoding_faces.forEach( e => list.push({'encode': e}));
  face .recall_faces.forEach( e => list.push({'recall': e}));
  list.push(list);
}

0
检查一下,我已经创建了一个函数,根据您预生成面孔的输入大小,它将为您提供N个列表,并且您的列表渲染器也不在实现范围内,因此它可以在任何地方使用...并且还可以进行更改。

function getNObjects(N, keyCallback) {
  const output = []
  for (var i = 0; i < N; i++) {
    output.push(keyCallback(i));
  }
  return output
}

// your code
function createList(index) {
  var list = [];
  var enc_len = pregenerated_faces[index].encoding_faces.length;
  var rec_len = pregenerated_faces[index].recall_faces.length;

  for (var i = 0; i < enc_len; i++) {
    var obj_encode = {
      'encode': pregenerated_faces[index].encoding_faces[i]
    };
    list.push(obj_encode);
  };

  for (var i = 0; i < rec_len; i++) {
    var obj_recall = {
      'reacall': pregenerated_faces[index].recall_faces[i]
    };
    list.push(obj_recall);
  };
  return list
}
// Test case
const pregenerated_faces = [{
    name: "Ardis Pool",
    gender: "male"
  },
  {
    name: "Barbra Panganiban",
    gender: "female"
  },
  {
    name: "Ralph Sales",
    gender: "male"
  },
]
// Test Function
function testFunction(index) {
  var list = [];
  var enc_len = pregenerated_faces[index].name
  var rec_len = pregenerated_faces[index].gender

  var obj_encode = {
    'encode': enc_len
  };
  list.push(obj_encode);
  obj_recall = {
    'reacall': rec_len
  };
  list.push(obj_recall);
  return list
}

const [one, two, three] = getNObjects(3, testFunction);
console.log(one, two, three)


谢谢,但您能否澄清一下“测试用例”注释下面的代码在做什么? - JadeHippo
测试用例只是为了展示函数的工作方式... pregenerated_faces 是一个列表,我们需要为每个索引创建多个列表... testFunction 是列表渲染器... 它将为该索引创建列表... 我使用 es6 语法来扩展 getNObjects 的输出,以一次性拥有所有列表。 - tarun jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接