簡體   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