2016-11-06 3 views
0

У меня есть массив объектов в этой формеПреобразование массива объектов в вложенной форме

nnz=[{ 

    "verb":"has", 

    "nouns": "employees" 
    }, 

    { 

    "verb":"has", 
    "nouns": "managers" 
    }, 

    { 

    "verb":"have", 
    "nouns": "departments" 
    } 
] 

, но я хочу, чтобы преобразовать его в эту форму

[ { 

    "verb":"has", 
    "nouns": ["employees", "managers"] 
    }, 

    { 
    "verb":"have", 
    nouns:["departments"] 
    } 
] 

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

Update: мы должны проверить глагол too.now он стал более сложным.

ответ

0

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

const array = [ 
 

 
    { 
 

 
    "verb":"has", 
 

 
    "nouns": "employees" 
 
    }, 
 

 
    { 
 

 
    "verb":"has", 
 
    "nouns": "managers" 
 
    }, 
 

 
    { 
 

 
    "verb":"has", 
 
    "nouns": "departments" 
 
    } 
 
] 
 

 
const aggregated = array.reduce((arr, el) =>{ 
 
    let found = arr.find(ll => ll.verb == el.verb); 
 
    if(found) found.nouns.push(el.nouns); 
 
    else arr.push({verb : el.verb, nouns : [el.nouns] }) 
 
    return arr; 
 
}, []); 
 
console.log(aggregated);

0

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

Затем сопоставьте временный объект с новым массивом.

nnz = [{ 
 
    "verb": "has", 
 
    "nouns": "employees" 
 
}, { 
 
    "verb": "has", 
 
    "nouns": "managers" 
 
}, { 
 
    "verb": "has", 
 
    "nouns": "departments" 
 
}] 
 

 
var tmp = {}; 
 
nnz.forEach(function(item) { 
 
    tmp[item.verb] = tmp[item.verb] || { 
 
    verb: item.verb, 
 
    nouns: [] 
 
    }; 
 
    tmp[item.verb].nouns.push(item.nouns); 
 
}); 
 

 
var results = Object.keys(tmp).map(function(key) { 
 
    return tmp[key]; 
 
}); 
 

 
console.log(results);

0

Попробуйте эти два подхода в соответствии с вашими требованиями. Я надеюсь, что он будет работать в соответствии с ожиданием .

Первый подход:

Когда вы знаете имена свойств:

var nnz = [{ 
 
"verb":"has", 
 
"nouns": "employees" 
 
    }, 
 
    { 
 
"verb":"has", 
 
"nouns": "managers" 
 
    }, 
 
{ 
 
"verb":"has", 
 
"nouns": "departments" 
 
    } 
 
]; 
 

 
var newObj = {}; 
 
var nouns = []; 
 
for (var i in nnz) { 
 
nouns.push(nnz[i].nouns); 
 
newObj.verb = nnz[i].verb; 
 
newObj.nouns = nouns; 
 
} 
 
    
 
nnz = newObj; 
 

 
console.log(nnz);

Второй подход:

Если вы не знаете, имена свойств:

var nnz = [{ 
 
    "verb":"has", 
 
    "nouns": "employees" 
 
    }, 
 
    { 
 
    "verb":"has", 
 
    "nouns": "managers" 
 
    }, 
 
    { 
 
    "verb":"has", 
 
    "nouns": "departments" 
 
    } 
 
]; 
 

 
var newObj = {}; 
 
var nounsArr = []; 
 
for (var i in nnz) { 
 
nounsArr.push(nnz[i][Object.keys(nnz[i])[1]]) 
 
nnz[i][Object.keys(nnz[i])[1]] = nounsArr; 
 
var Objlen = Object.keys(nnz[i]).length; 
 
for (var j=0;j<Objlen;j++) { 
 
var objKeys = Object.keys(nnz[i])[j]; 
 
newObj[objKeys] = nnz[i][objKeys]; 
 
} 
 
} 
 

 
nnz = newObj; 
 

 
console.log(nnz);