彼のプロパティの配列を平坦化することにより、オブジェクトを作成します。

ジョン:

私は、それぞれ単一のオブジェクトは、プロパティ配列の一つの値だけが含まれているオブジェクトの配列を作成する必要があります。

私は質問が非常に混乱していると考えているように私には、入力と期待される結果の一例を書きますが、私は実際にそれを説明するのか分かりません。

配列の最初の要素は、すべてのプロパティと配列の最初の値のみを含んでいます。最初の1の後に一人一人が最初の要素のidを参照する一意のIDと新しいプロパティ(例:リンク)を持っている必要があります。

入力:

const series = [
{
   id: 1,
   name: 'game of thrones',
   ep: ['01-01-2020','04-03-2020'] // This is the array that will split
},
{
   id: 2,
   name: 'stranger things',
   ep: ['03-02-2020']
}
]

予想される出力:

const newSeries = [
{
   id: 1, // same id as before
   name: 'game of thrones', // same name as before
   ep: ['01-01-2020'] // first element of the previous array
},
{
   id: 2, // untouched
   name: 'stranger things',
   ep: ['03-02-2020']
},
{
   id: 35, // Any id
   ep: ['04-03-2020'] // second element
   link: 1 // This is the id of the original element
   // name is not necessary
}
// If ep had 3 dates, it would make a new element 
]

私は、オブジェクトの順序については気にしません。アレイ内の任意の複数の要素があった場合にのみ、単一の1になるまでそれが継続します。

EDIT:私の試みを提出することを忘れました:

series.forEach(x => x.ep.map(epdate=> 
         newarray = [...newarray, {id:'some id', ep: epdate, link: x.id}]
    ))

私は、配列を分割するために管理が、アイテムが最初と名前を維持する必要性又は第一及びリンクを持っている必要があります後の場合であれば、私は認識してロジックを欠場します。プラス私は一意である必要があり、ランダムなIDを作成する必要があります。

それは、このコードで作業していたために管理:

serie.forEach(x => {
    x.ep.length > 1 ? 
    x.ep.map(y => 
        y === x.ep[0] ? 
         newarray = [...newarray, {id: x.id, name: x.name, ep: y}] :
        newarray = [...newarray, {id: 'id', ep: y, link: x.id}])
     : 
    newarray = [...newarray, {...x, ep: x.ep[0]}]
})

唯一の問題は、IDがユニークであることではないだろう。私もそれは非常にクリアでクリーンなコードが賢明ですとカルバンの答えをチェックアウトすることをお勧めします。

カルバン・ヌネス:

私は古き良き使用するように常に存在し、複数のアプローチがありますが、for(読みやすくするために、私の意見では)代わりにES6構文のループを、しかし、見てみましょう:

使用するforループへのあなたのseries、配列をそのを確認するep長さが1よりも大きいかどうかを確認するために
yesの場合、これらの手順を行うことができます。

  1. 取得ep新しい変数に配列を
  2. プッシュserie(得られた配列にオブジェクトをnewSeries
  3. 別の使用forループep(インデックス0は、元のセリエAに滞在するので、インデックス1から始まる)配列
  4. このループ内では、新しいオブジェクトを作成し、必要なプロパティを設定します
  5. この新しいオブジェクトをプッシュ newSeries

何場合は、単にそのプッシュしていないserieにオブジェクトをnewSeries

const series = [
  { id: 1, name: 'game of thrones', ep: ['01-01-2020', '04-03-2020', '01-05-2020']},
  { id: 2, name: 'stranger things', ep: ['03-02-2020']}
]

let newSeries = [];
let idCounter = series.length + 1;

for (let i = 0; i < series.length; i++) {
  let serie = series[i]

  if (serie.ep.length > 1) {
    let allEps = serie.ep;
    serie.ep = [serie.ep[0]]
    newSeries.push(serie);

    for (let j = 1; j < allEps.length; j++) {
      let newSerieObj = {};
      newSerieObj.id = idCounter;
      newSerieObj.ep = [allEps[j]]
      newSerieObj.link = serie.id;
      newSeries.push(newSerieObj);
      idCounter++;
    }
  } 
  else {
    newSeries.push(serie)
  }
}

console.log(newSeries)
.as-console-wrapper {
  min-height: 100%
}

:私は、変数を使用しているidCounterだけで例の目的のために、あなたは新しいIDを設定するために、独自のロジックを使用することができます。

あなたが作成されたオブジェクト(新しいIDを持つもの)は、常に配列の最後の来てほしい場合は、次の2つのオプションがあります:.sortIDによると、かにプッシュしていないnewSeriesが、別の配列に、そしてちょうど.concatすべてのループが終了した後に、この他のアレイ。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=31139&siteId=1