2015-09-27 4 views
0

Я пытаюсь создать массив, который обобщает другой массив. Я уже получил некоторые действительно хорошие идеи here, все они работают, но все они создают еще одно препятствие, которое я, опять же, не могу решить.Удаление пустых ключей объектов в массиве объектов

на основе @ kooiinc-х answer, мой текущий код выглядит следующим образом:

var grants = [ 
    { id: "p_1", location: "loc_1", type: "A", funds: "5000" }, 
    { id: "p_2", location: "loc_2", type: "B", funds: "2000" }, 
    { id: "p_3", location: "loc_3", type: "C", funds: "500" }, 
    { id: "p_2", location: "_ibid", type: "D", funds: "1000" }, 
    { id: "p_2", location: "_ibid", type: "E", funds: "3000" } 
]; 
var projects = []; 
grants.map(
function (v) { 
    if (!(v.id in this)) { 
     this[v.id] = v; 
     projects.push(v); 
    } else { 
     var current = this[v.id]; 
     current.type = [v.type].concat(current.type); 
     current.funds = [v.funds].concat(current.funds); 
    } 
}, {}); 

... который дает следующий желаемый результат (type и funds вступили в подмассивы, остальные выталкиваются без изменений):

[ 
    { "id": "p_1", "location": "loc_1", "type": "A", "funds": "5000" }, 
    { "id": "p_2", "location": "loc_2", "type": ["E","D","B"], "funds": ["3000","1000","2000"] }, 
    { "id": "p_3", "location": "loc_3", "type": "C", "funds": "500" } 
] 

Однако, если некоторые объекты имеют некоторые неопределенные значения ключа, результат будет иметь нулевые значения в массивах. Например, как это (смотреть на type массив):

[ 
    { "id": "p_1", "location": "loc_1", "type": "A", "funds": "5000" }, 
    { "id": "p_2", "location": "loc_2", "type": ["E",null,null], "funds": ["3000","1000","2000"] }, 
    { "id": "p_3", "location": "loc_3", "type": "C", "funds": "500" } 
] 

(Вот fiddle с одного и того же.)

Я попытался найти быстрый способ удалить их впоследствии (например, here или here), но по какой-то причине ни один из обычных методов (рекурсивного удаления всех ключей, которые не определены/null), похоже, работает независимо от того, где я помещаю их в свой код. Они не дают ошибок, они просто ничего не удаляют.

Возможно ли уже как-то исключить неопределенные ключи в сопоставлении?

Update: Таким образом, некоторые из ключей объектов не будут иметь какое-либо значения, просто [null,null,null] в то время как другие будут иметь несколько, но не все, как ["E",null,null]. Идея состоит в том, чтобы удалить все нулевые элементы, и если ничего не осталось, удалите также ключ объекта.

ответ

2

Попробуйте так:

grants.map(
function (v) { 
    if (!(v.id in this)) { 
     // => initialize if empty 
     v.type = v.type || []; 
     v.funds = v.funds || []; 
     this[v.id] = v; 
     projects.push(v); 
    } else { 
     var current = this[v.id]; 
     current.type = v.type ? [v.type].concat(current.type) : current.type; 
     current.funds = v.funds ? [v.funds].concat(current.funds) : current.funds; 
    } 
}, {}); 

Теперь пустые значения не будут отображаться в результатах.

+0

Да, я думал об этом тоже, но это не похоже, чтобы удалить все нули, смотрите здесь: http://jsfiddle.net/eebgasw6/1/ – tmr

+0

Я вижу, есть довольно простое решение. См. Отредактированный ответ – KooiInc

0

Я думаю, вы можете проверить возникновение как type, так и funds свойств и только в том случае, если они есть, а затем вставьте или обновите элемент.

a.type && a.funds && ... 

var grants = [ 
 
     { id: "p_1", location: "loc_1", type: "A", funds: "5000" }, 
 
     { id: "p_2", location: "loc_2", funds: "2000" }, 
 
     { id: "p_3", location: "loc_3", type: "C", funds: "500" }, 
 
     { id: "p_2", location: "_ibid", funds: "1000" }, 
 
     { id: "p_2", location: "_ibid", type: "E", funds: "3000" } 
 
    ], 
 
    project = []; 
 

 
grants.forEach(function (a) { 
 
    a.type && a.funds && !project.some(function (b, i) { 
 
     if (a.id === b.id) { 
 
      project[i].type.push(a.type); 
 
      project[i].funds.push(a.funds); 
 
      return true; 
 
     } 
 
    }) && project.push({ id: a.id, location: a.location, type: [a.type], funds: [a.funds] }); 
 
}); 
 
document.write('<pre>' + JSON.stringify(project, 0, 4) + '</pre>');

+0

Проблема в том, что я теряю возможность присоединиться к тем, к которым я хочу присоединиться ('type' и' funds' в примере). – tmr