2017-12-18 20 views
0

この問題は、map()の使用に関する私の以前の投稿の1つで、標準if/elseブロックを使用して解決されました。しかし、今私は別の問題があります。ここでは、if/elseを使用したソリューションがあります。機能矢印のあるマップ()が機能しないのはなぜですか?

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" 
     content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Transforming Data</title> 
    <script src="https://unpkg.com/[email protected]/babel.min.js"></script> 
</head> 
<body> 
    <h1>Transforming Data</h1> 
    <p>Open the console</p> 

    <script type="text/babel"> 

    // Editing one object in an array of objects 

    let schools = [ 
     {name: 'Yorktown'}, 
     {name: 'Stratford'}, 
     {name: 'Washington & Lee'}, 
     {name: 'Wakefield'} 
    ]; 

    const editName = (oldName, newName, arr) => 
     arr.map(item => { 
     if (item.name === oldName) { 
      return { 
      ...item, 
      name: newName 
      } 
     } 
     else { 
      return item 
     } 
     }); 

    let updatedSchools = editName('Stratford', 'HB Woodlawn', schools); 

    console.log(updatedSchools[1]); // {name: "HB Woodlawn"} 
    console.log(schools[1]); // {name: "Stratford"} 

    </script> 

</body> 
</html> 

しかし、機能矢印を使用しているときは私にはうまくいきません。置換時にマッピングが行われません。しかし、私は同じソリューション、すなわち: '名前:名前'を使用しています。私は間違って何をしていますか?

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" 
     content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Transforming Data</title> 
    <script src="https://unpkg.com/[email protected].15.0/babel.min.js"></script> 
</head> 
<body> 
    <h1>Transforming Data</h1> 
    <p>Open the console</p> 

    <script type="text/babel"> 

    let schools = [ 
     'Yorktown', 
     'Stratford', 
     'Washington & Lee', 
     'Wakefield' 
    ]; 

    const editName = (oldName, name, arr) => 
     arr.map(item => (item.name === oldName) ? 
     ({...item, name: name}) : 
     item 
    ); 

    let updatedSchools = editName('Stratford', 'HB Woodlawn', schools); 

    console.log(updatedSchools[1]); // Stratford 
    console.log(schools[1]); // Stratford 

    </script> 

</body> 
</html> 
+5

あなたの新しい配列は文字列配列ではなく、オブジェクト配列であるため、 'item.name'は常に未定義 – user184994

+0

を返します。つまり、' name'の性質を持っていません'item.name'は未定義です – Niladri

答えて

0

申し訳ありません、この問題に関する私のオリジナルの記事には、オブジェクトの配列であったはずの誤った文字列が含まれていました。みんなの時間を無駄にして謝った。次のコードは、実際にうまく動作しない:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" 
     content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Transforming Data</title> 
    <script src="https://unpkg.com/[email protected]/babel.min.js"></script> 
</head> 
<body> 
    <h1>Transforming Data</h1> 
    <p>Open the console</p> 

    <script type="text/babel"> 

    let schools = [ 
     {name: 'Yorktown'}, 
     {name: 'Stratford'}, 
     {name: 'Washington & Lee'}, 
     {name: 'Wakefield'} 
    ]; 

    const editName = (oldName, name, arr) => 
     arr.map(item => (item.name === oldName) ? 
     ({...item, name: name}) : 
     item 
    ); 

    let updatedSchools = editName('Stratford', 'HB Woodlawn', schools); 

    console.log(updatedSchools[1]); // {name: "HB Woodlawn"} 
    console.log(schools[1]); // {name: "Stratford"} 

    </script> 

</body> 
</html> 
2

あなたの新しい配列は文字列配列ではなく、オブジェクト配列であるため、item.nameは常に未定義戻ります意味、nameプロパティを持っていません。

あなたは文字列の配列を引き続き使用したい場合は、そのようなあなたの機能を変更する必要があります。

let schools = [ 
 
     'Yorktown', 
 
     'Stratford', 
 
     'Washington & Lee', 
 
     'Wakefield' 
 
    ]; 
 

 
    const editName = (oldName, name, arr) => 
 
     arr.map(item => (item === oldName) ? name : item); 
 

 
    let updatedSchools = editName('Stratford', 'HB Woodlawn', schools); 
 

 
    console.log(updatedSchools[1]); // Stratford 
 
    console.log(schools[1]); // Stratford

0

あなたの元の配列は、単なる文字列の配列でない配列でしたオブジェクトのnameプロパティを持っていないので、.map()を使用して各配列要素にアクセスしているときは、現在のコードでnameプロパティにアクセスすることはできません。文字列配列で同じ結果を得るには、各配列文字列要素を繰り返し処理し、必要な要素を置き換える以下のコードを試してみてください。元のコードitem.nameは未定義を返します。

let schools = [ 
     'Yorktown', 
     'Stratford', 
     'Washington & Lee', 
     'Wakefield' 
    ]; 

    const editName = (oldName, name, arr) => 
     arr.map(item => (item === oldName) ? 
     name : item 
    ); 

    let updatedSchools = editName('Stratford', 'HB Woodlawn', schools); 

    console.log(updatedSchools[1]); // HB Woodlawn 
    console.log(schools[1]); // Stratford 
+0

コードを投稿するだけではありません。元のコードに何が間違っていたか、またその修正方法を説明してください。 – Barmar

+0

@Barmar doneが私の説明を追加しました – Niladri

関連する問題