javascript объект группы с различными свойствами - PullRequest
0 голосов
/ 12 декабря 2018

мой вопрос прост,

Мой ввод

[ 
 { department_id: '28', linear_meter: 6 },
 { department_id: '56', linear_meter: 19 },
 { department_id: '28', square_meters: 20.28 },
 { department_id: '56', square_meters: 18.28827 } 
]

И я хочу что-то вроде этого:

      [
       {
         "department_id": 28,
         "linear_meters": 6,
         "square_meters": 20.28
        },
       {
         "department_id": 56,
         "linear_meters": 19,
         "square_meters": 18.28827
        },
       ]

Я попробовал это, норезультат не совсем то, что я хочу

var result = arr.reduce(function (res, obj) {
            if (!(obj.department_id in res))
                res.__array.push(res[obj.department_id] = obj);
            else {
                res[obj.department_id].linear_meter += obj.linear_meter;
                res[obj.department_id].square_meters += obj.square_meters;
            }
            return res;
        }, {__array: []}).__array;

но вывод:

[ { department_id: '28', 
    linear_meter: NaN, 
    square_meters: NaN },
  { department_id: '56', 
    linear_meter: NaN, 
    square_meters: NaN } ]

Кто-то есть идея?Я тестировал раньше + =

  typeof res[obj.department_id].square_meters !== "undefined"

но ничего не изменилось ...

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Альтернативный подход, приводящий к объекту с department_id в качестве ключей, используя Object.assign() для объединения свойств, а затем используйте Object.values для возврата окончательного массива

const data = [ 
 { department_id: '28', linear_meter: 6 },
 { department_id: '56', linear_meter: 19 },
 { department_id: '28', square_meters: 20.28 },
 { department_id: '56', square_meters: 18.28827 } 
]


const res = Object.values(
  data.reduce(function(a, c) {
    const id = c.department_id;
    a[id] = a[id] || {}
    Object.assign(a[id], c)
    return a;
  }, {})
)

console.log(res)
0 голосов
/ 12 декабря 2018

Хорошо, у объекта может не быть элемента, поэтому вы добавляете число в undefined.Проще всего использовать Object.assign () для копирования свойств.

var arr = [{
    department_id: '28',
    linear_meter: 6
  },
  {
    department_id: '56',
    linear_meter: 19
  },
  {
    department_id: '28',
    square_meters: 20.28
  },
  {
    department_id: '56',
    square_meters: 18.28827
  }
];

var result = arr.reduce(function(res, obj) {
  if (!(obj.department_id in res))
    res.__array.push(res[obj.department_id] = obj);
  else {
    Object.assign(res[obj.department_id], obj)

  }
  return res;
}, {
  __array: []
}).__array;

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