Сплайсинг YouTube-канала в формате JSON - PullRequest
1 голос
/ 04 мая 2011

Допустим, у меня есть следующий (поддельный) результат фида с YouTube с использованием API фидов Google.

{ "feed" : { "author" : "YouTube",
      "description" : "",
      "entries" : [ { "author" : "Foo",
            "categories" : [ "http://gdata.youtube.com/schemas/2007#video",
                "Entertainment",
                "golf",
                "resort"
              ],
            "content" : "Four friends are playing golf. Originally aired on 3/22/2011.",
            "contentSnippet" : "Four friends are still playing golf. Originally aired on ...",
            "link" : "http://www.linktoyoutubevid.com",
            "publishedDate" : "Thu, 24 Mar 2011 07:07:13 -0700",
            "title" : "Foobar"
          },

       .....more feed entries here.....

        ],
      "feedUrl" : "http://www.myyoutubefeed.com",
      "link" : "http://www.youtube.com",
      "title" : "YouTube Videos",
      "type" : "atom10"
    },
  "m" : "json",
  "status" : { "code" : 200 }
}

Я хочу сохранить этот результат фида (сохраняя формат JSON) в переменной, но сначала я хочу удалить такие элементы, как категории, контент и contentSnippet. Я пытался использовать .splice, но продолжал получать эту ошибку: Ошибка: feedResult.feed.entries[0].splice is not a function

Вот часть моего фид-звонка:

feedUrl: opts.sourceUrl,
type: "video",
numEntries: 3,
onFeedLoad: function(feedResult) {
    //alert(feedResult);
    formatVids(feedResult);
    var test = feedResult.feed.entries[0].splice(1,3);
    //alert(test);

Как правильно использовать .splice в этом сценарии? Я мог запутаться, нужно ли мне соединять строку JSON или объект JSON. Есть ли лучшее решение?

Спасибо!

1 Ответ

0 голосов
/ 04 мая 2011

К сожалению, ключи объекта не эквивалентны ключам массива в одном очень важном аспекте: порядок не сохраняется при работе с ключами объекта.

Один из способов выполнить то, что вы пытаетесь сделать, это:

var resultFeed = feedResult.feed.entries.map( function(entry){
  delete entry.category;
  delete entry.content;
  delete entry.contentSnippet;
  return entry;
})

Что касается проблемы совместимости IE, то из документации MDC по теме.

Совместимость

карта - недавнее дополнение к стандарту ECMA-262; как таковой он может не присутствовать в других реализациях стандарта. Вы можете обойти это, вставив следующий код в начало ваших скриптов, что позволяет использовать карту в реализациях, которые изначально не поддерживают ее. Этот алгоритм в точности соответствует алгоритму, указанному в ECMA-262, 5-е издание, при условии, что Object, TypeError и Array имеют свои исходные значения и что fun.call оценивает исходное значение Function.prototype.call.

if (!Array.prototype.map)
{
  Array.prototype.map = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var res = new Array(len);
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
        res[i] = fun.call(thisp, t[i], i, t);
    }

    return res;
  };
}
...