Транспонирование JSON - PullRequest
3 голосов
/ 09 мая 2011

Я бы хотел извлечь все свойства однородной коллекции JSON в свой собственный массив.

Например, дано:

var dataPoints = [
    {
        "Year": 2005,
        "Value": 100 
    },
    {
        "Year": 2006,
        "Value": 97 
    },
    {
        "Year": 2007,
        "Value": 84 
    },
    {
        "Year": 2008,
        "Value": 102 
    },
    {
        "Year": 2009,
        "Value": 88 
    },
    {
        "Year": 2010,
        "Value": 117 
    },
    {
        "Year": 2011,
        "Value": 104 
    }
];

Я бы хотел извлечь массив всех значений из dataPoints, который выглядит примерно так:

var values = [100, 97, 84, 102, 88, 117, 104];

Вместо того, чтобы повторять и конструировать вручную, есть ли чистый / эффективный способ для выполнения этого вида транспонирования?

Ответы [ 3 ]

5 голосов
/ 09 мая 2011

В конечном счете, вам потребуется выполнить итерацию.

Функция map - это то, что вам нужно:

function map(array, callback) {
    var result = [],
        i;

    for (i = 0; i < array.length; ++i) {
        result.push(callback(array[i]));
    }

    return result;
}

// ...

var values = map(dataPoints, function(item) { return item.Value; });

... или просто использовать внешнийФункция карты библиотеки:

5 голосов
/ 09 мая 2011

вы, вероятно, можете сделать интересных вещей , создав собственную функцию карты в зависимости от того, что вам нужно с ней делать ... но в конце дня вы закончите итерацией исходного массива и вытаскивая интересующее вас значение

Просто для удовольствия, учитывая этот метод:

function project(a, fn)
{
var list = new Array();
    for (i = 0; i < a.length; i++)
    {
        list.push(fn(a[i]));
    }
return list;
}

Вы можете легко получить массив, который выглядит как то, что вы описываете:

var dataPoints = [
    { Year: 2005,
      Value: 100
    },
    { Year: 2006,
      Value: 97
    },
    { Year: 2007,
      Value: 84
    },
    { Year: 2008,
      Value: 102
    },
    { Year: 2009,
      Value: 88
    },
    { Year: 2010,
      Value: 117
    },
    { Year: 2011,
      Value: 104
    }
];

var list = project(dataPoints, function(p) { return p.Value; });

alert(list[0]);  // alerts '100'
0 голосов
/ 09 мая 2011

Я согласен с Джоэлом, что здесь нет никакой магии - вам нужно будет перебрать массив, чтобы извлечь значения.Самый быстрый способ перебора массива - это простой цикл for.Смотрите здесь для хорошего поста о производительности итерации массива.В конце дня, даже для очень большого массива, это не должно быть очень дорогой операцией, если вы правильно ее закодируете.структура данных, как они создаются.Например: если у вас есть цикл, который создает эти данные, вы могли бы также создать массив «значений» одновременно с созданием массива «объектов» года? *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...