2014-01-31 5 views
1

Я пытаюсь проанализировать под-объекты объекта Javascript, чтобы подсчитать количество под-объектов, которые являются одинаковыми, и вернуть новый объект JSON с этими значениями. Это, наверное, не очень понятно, так вот fiddle.Подсчет дублирующих объектов в массиве объектов Javascript

Учитывая crsListData в скрипке, я хотел бы вернуться в следующем:

objToReturn = [ 
      { 
       key: "Consigned", 
       values: 
        [ 
         { mapKey: 2007 (4), mapVal: [["Ford F-150 (3)"], ["Honda Civic (1)"]] }, 
         { mapKey: 2011 (1), mapVal: "Toyota Camry (1)" }, 
         { mapKey: 2005 (1), mapVal: "Dodge RAM (1)" } 
        ] 
      }, 
      { 
       key: "Run", 
       values: 
        [ 
         { mapKey: 2007 (2), mapVal: "Ford F-150 (2)" }, 
         { mapKey: 2011 (1), mapVal: "Toyota Camry (1)" } 
        ] 
      }, 
      { 
       key: "Sold", 
       values: 
        [ 
         { mapKey: 2007 (1), mapVal: "Ford F-150 (1)" }, 
         { mapKey: 2011 (1), mapVal: "Toyota Camry (1)" } 
        ] 
      } 
     ]; 

Если вы заметите в скрипке, я комментировал часть о mapKey и mapValue. Они будут определяться параметрами функции, полученными из опции выбора для заказа по модели (счет)/году (счет) или году (счет)/модели (счет).

Моя конечная цель здесь, чтобы генерировать HTML-дерево, которое по существу выглядит следующим образом:

  1. отправляемые (# консигнационного)

    • 2007 (общее количество моделей 2007)
      • Модель 1 (кол-во)
      • Модель 2 (кол-во)
    • 2011 (общее количество моделей 2007)
  2. Run (# бега)

    • 2007 (общее количество моделей 2007)
      • Модель 1 (кол)
      • Модель 2 (кол-во)
    • 2011 (общее количество моделей 2007 года)
  3. Продан (такой же, как указано выше)

Порядок лет должны быть основаны на общем количестве моделей на этот год (первый высокий #). Точно так же порядок моделей в течение лет должен быть упорядочен по наивысшему счету.

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

  1. консигнационного (# консигнационного)

    • Model1 (общее количество этой модели за все годы)
      • год 1 (кол-моделей в этом году)
      • год 2 (количество моделей в этом году)
    • Model2 (общее количество этой модели за все годы)
  2. Run (# бега)

    • Model1 (общее количество этой модели за все годы)
      • Год 1 (кол-во моделей на этот год)
      • Год 2 (кол-во моделей на этот год)
    • Model2 (общее количество этой модели за все годы)
  3. Продан (такой же, как указано выше)

Упорядочение это будет основываться на подсчете, а также. Дайте мне знать, если вам нужно разъяснение! Благодаря!

+0

que сценарий kiddie лавина «это не json» 5, 4, 3 – dandavis

+0

@WillWeld, это не json. JSON является * обозначением *. У вас есть * JavaScript Object *. –

+0

@ExplosionPills Ой ... изменил название - лучше? Редактировать: Я ужасен с семантикой. Является objToReturn массив JSON объектов Javascript? Или это объект Javascript с под-объектами? –

ответ

4

Корень из того, что вы хотите сделать, прост. Вы хотите группировать данные по некоторому свойству. Что заставляет вас казаться сложным, так это то, что вы хотите сделать это на нескольких уровнях.

Сначала у вас есть 3 набора данных «Отправлено», «Выполнить», «Продано». Решите его для одного, и вы решите его для всех.

Сначала у вас есть автомобили, сгруппированные по модели. В рамках модели у вас есть автомобили, сгруппированные по годам. И снова ядро ​​этого состоит в том, что вы хотите группировать данные по некоторому свойству.

Вы можете использовать функцию, как это сделать:

var cars = [ 
      { year: 2007, model: "Ford F-150" }, 
      { year: 2011, model: "Toyota Camry" }, 
      { year: 2007, model: "Ford F-150" }, 
      { year: 2007, model: "Ford F-150" }, 
      { year: 2005, model: "Dodge RAM" } 
     ]; 

function groupBy(propertyName, array) { 
    var groupedElements = {}; 

    for(var i = 0; i < array.length; i++) { 
     var element = array[i]; 
     var value = element[propertyName]; 

     var group = groupedElements[value]; 
     if(group == undefined) { 
      group = [element]; 
      groupedElements[value] = group; 
     } else { 
      group.push(element); 
     } 
    } 

    return groupedElements; 
} 

var result = groupBy("year", cars) 

Выход будет таким:

{ 
    "2005": [ 
     { 
      "year": 2005, 
      "model": "Dodge RAM" 
     } 
    ], 
    "2007": [ 
     { 
      "year": 2007, 
      "model": "Ford F-150" 
     }, 
     { 
      "year": 2007, 
      "model": "Ford F-150" 
     }, 
     { 
      "year": 2007, 
      "model": "Ford F-150" 
     } 
    ], 
    "2011": [ 
     { 
      "year": 2011, 
      "model": "Toyota Camry" 
     } 
    ] 
} 

Вы можете играть с ним в этом JSFiddle: http://jsfiddle.net/luisperezphd/jCt2k/

You может выполнить то, что вы хотите сделать этой группировкой на каждом уровне. Первая группа по годам. Затем пройдите через каждую из генерируемых групп и сгруппируйте по годам. Ваш счет будет length массива значений.

+0

Это замечательно! Спасибо огромное! –

+0

Вы сделали это друг (y) – NullPointer

Смежные вопросы