在javascript中检索Array.map的结果

时间:2019-03-09 12:25:04

标签: javascript

我有与此结构类似的代码。似乎我在这里不需要异步函数,但是就像我说的那样,它与我自己的代码很长。

这是我的代码:

const array = [
  { methods: 'user.js'},
  { methods: 'test.js'},
  { methods: 'hello.js' },
];
async function bigTest() {
  async function details() {
    const arr = [];
    const test = [];
    const files = array.map(async (i) => {
      arr.push({
        name: i,
        item: [
          {
            name: 'test',
          },
        ],
      });
      return test.push(arr);
    });
    return Promise.all(files);
  }
  const result = await details();
  console.log(JSON.stringify(result));
}
bigTest();

每次推入数组的过程,console.log(arr)都会为我返回:

[ { name: { methods: 'user.js', item: [] }, item: [ [Object] ] } ]

[ { name: { methods: 'user.js', item: [] }, item: [ [Object] ] },
  { name: { methods: 'test.js', item: [] }, item: [ [Object] ] } ]

[ { name: { methods: 'user.js', item: [] }, item: [ [Object] ] },
  { name: { methods: 'test.js', item: [] }, item: [ [Object] ] },
  { name: { methods: 'hello.js', item: [] }, item: [ [Object] ] } ] 

我想返回带有所有推入元素的最后一个数组,但结果是[1,2,3]

当我在阵列测试中执行console.log时,我得到了重复的对象

3 个答案:

答案 0 :(得分:2)

  

我想返回带有所有推入元素的最后一个数组,但结果是[1,2,3]

来自MDN

  

push()方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。

因此,您需要返回元素本身,而不是test.push(arr)的结果。将return test.push(arr)替换为:

test.push(arr);
return test[test.length-1];

然后console.logresult中的最后一项:

console.log(JSON.stringify(result[result.length-1]));

const array = [
  { methods: 'user.js', item: [] },
  { methods: 'test.js', item: [] },
  { methods: 'hello.js', item: [] },
];
async function bigTest() {
  async function details() {
    const arr = [];
    const test = [];
    const files = array.map(async (i) => {
      arr.push({ name: i, item: [{ name: 'test' }] });
      test.push(arr);
      return test[test.length-1];
    });
    return Promise.all(files);
  }
  const result = await details();
  console.log(JSON.stringify(result[result.length-1]));
}
bigTest();

我假设您将arrtest用于其他用途,否则,可以通过除去中间数组并记录整个结果数组来简化代码:

const array = [
  { methods: 'user.js', item: [] },
  { methods: 'test.js', item: [] },
  { methods: 'hello.js', item: [] },
];
async function bigTest() {
  async function details() {
    return Promise.all(array.map(async (i) =>
      ({ name: i, item: [{ name: 'test' }] })
    ));
  }
  const result = await details();
  console.log(JSON.stringify(result));
}
bigTest();

答案 1 :(得分:1)

return test.push(arr);不给您arr,而是给您新的长度test。您的files将是整数的承诺,而您的result将是整数的数组。

此外,您将创建一个数组arr和一个数组test,您要反复将arr推入其中。似乎不需要任何嵌套,因此不要多次push

您可以选择return testreturn arr,但实际上您不应该自己push设置这些值。 map已经为您创建了新数组,您只需要从回调中返回各自的值即可:

async function bigTest() {
  const filePromises = array.map(async (i) => {
    // I assume you await something here, otherwise the `async` is really unnecessary
    return {
//  ^^^^^^
      name: i,
      item: [
        {
          name: 'test',
        },
      ],
    };
  });
  const files = await Promise.all(filePromises);
  console.log(JSON.stringify(files));
}

答案 2 :(得分:0)

此行:

return test.push(arr);

返回test数组的新长度,该长度是1乘2然后是3,因此文件数组最终包含[1,2,3]

您可能要替换:

return Promise.all(files);

具有:

return Promise.all(files).then(() => arr);

它将执行promise,然后返回arr数组的内容。

或者,我不确定您要做什么,但是您可以简化为:

async function bigTest() {
  async function details() {
    const files = array.map(async (i) => {
      return {
        name: i,
        item: [
          {
            name: 'test',
          },
        ],
      };
    });
    return Promise.all(files);
  }
  const result = await details();
  console.log(JSON.stringify(result));
}
bigTest();