繁体   English   中英

数组减少累加器为空数组,推送不起作用

[英]array reduce accumulator as an empty array, push not working

为什么 accumulator.push 无效? 累加器是一个空数组?? 如果我使用预定义的变量flarArray ,一切正常,我知道如果 reduce 回调中没有包含初始值,那么它将使用数组中的第一项(在我的情况下将是一个对象)蓄能器? 但是如果我告诉它从作为累加器的数组开始,那有什么问题?

const profiles = [
  {
    id: 1,
    userID: '1',
    favoriteMovieID: '1',
  },
  {
    id: 2,
    userID: '2',
    favoriteMovieID: '1',
  }
];

const users = {
  1: {
    id: 1,
    name: 'Jane Cruz',
    userName: 'coder',
  },
  2: {
    id: 2,
    name: 'Matthew Johnson',
    userName: 'mpage',
  }
};

const movies = {
  1: {
    id: 1,
    name: 'Planet Earth 1',
  },
  2: {
    id: 2,
    name: 'Selma',
  }
};
let flatArray = [];
const flattenedProfiles = profiles.reduce(function(accumulator, currentProfile) {  
  return accumulator.push({id: currentProfile.id, name: users[currentProfile.id].name, favoriteMovie: movies[currentProfile.favoriteMovieID].name})
},[]);

Array.pushreduce回调的返回中返回数组的新长度,您正在返回无法执行下一次推送操作的新长度。 使用Array.concat代替或在Array.push之后也返回数组。

const flattenedProfilesPush = profiles.reduce((acc, curr) => {  
    acc.push({
        id: curr.id,
    })
    return acc
},[])


const flattenedProfilesConcat = profiles.reduce((acc, curr) =>  
    acc.concat({
        id: curr.id,
    }),[]
)

您需要返回accumulator ,而不是返回push function 的返回值,这是添加新项目后数组的大小。 在下一次迭代中,您将在 integer 上调用push function

const flattenedProfiles = profiles.reduce((acc, curr) => {  
  acc.push({
     id: curr.id,
     name: users[curr.id].name,
     favoriteMovie: movies[curr.favoriteMovieID].name
  });

  return acc;
},[]);

问题是你返回accumulator.push() 这将返回数组的长度,因此您的下一个累加器将是一个数字而不是一个数组。

我最好返回一个数组并在累加器上使用扩展运算符。

 const profiles = [ { id: 1, userID: '1', favoriteMovieID: '1', }, { id: 2, userID: '2', favoriteMovieID: '1', } ]; const users = { 1: { id: 1, name: 'Jane Cruz', userName: 'coder', }, 2: { id: 2, name: 'Matthew Johnson', userName: 'mpage', } }; const movies = { 1: { id: 1, name: 'Planet Earth 1', }, 2: { id: 2, name: 'Selma', } }; let flatArray = []; const flattenedProfiles = profiles.reduce(function(accumulator, currentProfile) { return [...accumulator, {id: currentProfile.id, name: users[currentProfile.id].name, favoriteMovie: movies[currentProfile.favoriteMovieID].name}] },[]); console.log(flattenedProfiles);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM