1

このオブジェクトには、オブジェクトの配列(「ページ」)が含まれています

var obj = {
    "pages" : [
        {   
            "title": "title one",
            "sub" : [
                { "title" : "title one one"},
                { "title" : "title one two"}
            ]
        },
        { "title" : "title two" },
        { 
            "title" : "title three",
            "sub" : [
                { "title" : "title three one"},
                { "title" : "title three two"},
                { "title" : "title three three"}
            ]
        }
    ]
}

このような期待される結果 (「ページ」の各オブジェクトに「スラッグ」要素を追加)

{
    "pages" : [
        {
            "title" : "title one",
            "slug" : "title-one",
            "sub" : [ 
                {
                    "title" : "title one one",
                    "slug" : "title-one-one"
                },
                {
                    "title" : "title one two",
                    "slug" : "title-one-two"
                }
            ]
        },
        {
            "title" : "title two",
            "slug" : "title-two"
        },
        {
            "title" : "title three",
            "slug"  : "title-three",
            "sub" : [
                {
                    "title" : "title three one",
                    "slug" : "title-three-one"
                },
                {
                    "title" : "title three two",
                    "slug" : "title-three-two"
                },
                {
                    "title" : "title three three",
                    "slug" : "title-three-three"
                }
            ]
        }
    ]
}

私はそれのようにすることができると思います

function add_slug(array_of_obj)
{
    for (var item in array_of_obj) {

        //i am not sure about this:
        item.slug = item.title.replace(/ /g, '-');

        if(typeof item.sub !== undefined) {
            add_slug(item.sub);
        }
    }
}

add_slug(obj.pages);

しかしundefined item.title、関数を変更し続けていますが、まだ機能していないので、助けが必要です。ありがとう。

4

2 に答える 2

2

itemオブジェクトの現在のプロパティを表す文字列です。あなたがする必要があるitemのは、オブジェクトからプロパティを取得するために使用することです。

array_of_obj[item].slug = array_of_obj[item].title.replace(/ /g, '-');

if(array_of_obj[item].sub !== undefined) {
    add_item(array_of_obj[item].sub);
}

したがって、エラーは、文字列にプロパティitemがないため、呼び出しが不可能であることが原因でした。titleundefined.replace()


また、 のtypeofテスト時に間違って使用していましたundefined。を使用せずに比較する方がよいでしょうtypeof

また、再帰呼び出しはadd_itemの代わりに使用していましたadd_slug


for最後に、JavaScript では、ループではなく Array でループを使用する方が適切for-inです。これにはいくつかの理由があります。あなたの特定のケースでは、違いはないかもしれませんが、全体的にはより良い方法です。

したがって、最終的な関数は次のようになります。

function add_slug(array_of_obj)
{
    for (var i = 0; i < array_of_obj.length; i++) {

        array_of_obj[i].slug = array_of_obj[i].title.replace(/ /g, '-');

        if(array_of_obj[i].sub !== undefined) {
            add_slug(array_of_obj[i].sub);
        }
    }
}

 add_slug(obj.pages);

または、次のように ES5 機能を使用します。

function add_slug(array_of_obj)
{
    array_of_obj.forEach(function(item) {

        item.slug = item.title.replace(/ /g, '-');

        if(item.sub !== undefined) {
            add_slug(item.sub);
        }
    }); 
}

 add_slug(obj.pages);

または、別のアプローチは次のようになります。

function add_slug(item) {

    item.slug = item.title.replace(/ /g, '-');

    if(item.sub !== undefined) {
        item.sub.forEach(add_slug);
    }
}

obj.pages.forEach(add_slug);

またはこれ:

obj.pages.forEach(function add_slug(item) {

    item.slug = item.title.replace(/ /g, '-');

    if(item.sub !== undefined) {
        item.sub.forEach(add_slug);
    }
});
于 2013-09-04T00:53:38.490 に答える
2

for-in ではなく for ループを使用するように変更 - 配列に対してより安全。

これを試して:

function add_slug(array_of_obj)
{
    for(var pageIdx = 0; pageIdx < array_of_obj.length; ++pageIdx) {
        var curPage = array_of_obj[pageIdx];

        if(curPage.title) {
            curPage.slug = curPage.title.split(' ').join('-');
        }

        if(curPage.sub) {
            add_slug(curPage.sub);
        }
    }
}

結果:

{
  "pages": [
    {
      "title": "title one",
      "sub": [
        {
          "title": "title one one",
          "slug": "title-one-one"
        },
        {
          "title": "title one two",
          "slug": "title-one-two"
        }
      ],
      "slug": "title-one"
    },
    {
      "title": "title two",
      "slug": "title-two"
    },
    {
      "title": "title three",
      "sub": [
        {
          "title": "title three one",
          "slug": "title-three-one"
        },
        {
          "title": "title three two",
          "slug": "title-three-two"
        },
        {
          "title": "title three three",
          "slug": "title-three-three"
        }
      ],
      "slug": "title-three"
    }
  ]
} 
于 2013-09-04T01:01:36.320 に答える