我有一组数组:
sample = [
{
'name' : 'alpha',
'inner' : [
{
'name' : 'beta',
'inner' : [
{
'name' : 'gamma',
'inner' : [
{
'name' : 'one',
'inner' : []
}
]
}
]
}
]
},
{
'name' : 'alpha',
'inner' : [
{
'name' : 'beta',
'inner' : [
{
'name' : 'gamma',
'inner' : [
{
'name' : 'two',
'inner' : []
}
]
}
]
}
]
},
{
'name' : 'epsilon',
'inner' : [
{
'name' : 'one',
'inner' : []
}
]
},
{
'name' : 'epsilon',
'inner' : [
{
'name' : 'two',
'inner' : []
}
]
}
]
我想以递归的方式合并到这个:
sample = [
{
'name' : 'alpha',
'inner' : [
{
'name' : 'beta',
'inner' : [
{
'name' : 'gamma',
'inner' : [
{
'name' : 'one',
'inner' : []
},
{
'name' : 'two',
'inner' : []
}
]
}
]
}
]
},
{
'name' : 'epsilon',
'inner' : [
{
'name' : 'one',
'inner' : []
},
{
'name' : 'two',
'inner' : []
}
]
}]
这是我到目前为止所拥有的:
据我了解这是它应该如何工作,意味着有一个递归进入每个"内部"然后合并数组。
function _merge(arr) {
//
var result = [];
//
for (var i = 0; i < arr.length; i++) {
var found = false;
//
for (var j = 0; j < result.length; j++) {
//
if ( result[j].name == arr[i].name) {
found = true;
//
result[j].inner = result[j].inner.concat(arr[i].inner);
//
break;
}
}
if (!found) {
//
result.push(arr[i]);
//
}
}
//
return result
//
}
//
function traverse(o ) {
for (i in o) {
if (!!o[i] && typeof(o[i])=="object") {
//
try{
//
build_array[i] = _merge(o[i])
//
}catch(e){
//
build_array = o[i]
//
}
//
traverse(o[i].inner );
}
}
}
//
谢谢你的帮助
答案 0 :(得分:1)
您可以使用迭代和递归方法合并相同的命名对象。
var data = [{ name: 'alpha', inner: [{ name: 'beta', inner: [{ name: 'gamma', inner: [{ name: 'one', inner: [] }] }] }] }, { name: 'alpha', inner: [{ name: 'beta', inner: [{ name: 'gamma', inner: [{ name: 'two', inner: [] }] }] }] }, { name: 'epsilon', inner: [{ name: 'one', inner: [] }] }, { name: 'epsilon', inner: [{ name: 'two', inner: [] }] }],
result = [];
data.forEach(function iter(r) {
return function (a) {
var o;
if (!r.some(function (b) { if (a.name === b.name) { o = b; return true; } })) {
r.push(a);
return;
}
Array.isArray(a.inner) && a.inner.forEach(iter(o.inner = o.inner || []));
};
}(result));
console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
有关其他属性,您可以添加
Object.keys(a).forEach(function (k) {
if (['name', 'inner'].indexOf(k) === -1) {
o[k] = a[k];
}
});
用于迭代所有属性,并仅分配不是name
或inner
的密钥。
var data = [{ name: 'alpha', data1: '1', inner: [{ name: 'beta', data2: '2', inner: [{ name: 'gamma', data3: '3', inner: [{ name: 'one', data4: '4', inner: [] }] }] }] }, { name: 'alpha', data5: '5', inner: [{ name: 'beta', data6: '6', inner: [{ name: 'gamma', data7: '7', inner: [{ name: 'two', data8: '8', inner: [] }] }] }] }, { name: 'epsilon', data9: '9', inner: [{ name: 'one', data10: '10', inner: [] }] }, { name: 'epsilon', data11: '11', inner: [{ name: 'two', data12: '12', inner: [] }] }],
result = [];
data.forEach(function iter(r) {
return function (a) {
var o;
if (!r.some(function (b) { if (a.name === b.name) { o = b; return true; } })) {
r.push(a);
return;
}
Object.keys(a).forEach(function (k) {
if (['name', 'inner'].indexOf(k) === -1) {
o[k] = a[k];
}
});
Array.isArray(a.inner) && a.inner.forEach(iter(o.inner = o.inner || []));
};
}(result));
console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
这就是你想要的:
function merge(sourceArray,lastResult){
var output=lastResult || [];
sourceArray.forEach(function(sourceItem){
var founded=output.filter(function(item){
return item.name==sourceItem.name;
})[0];
if(!founded){
founded={
name:sourceItem.name,
inner:[]
};
output.push(founded);
}
founded.inner= merge(sourceItem.inner||[],founded.inner)
});
return output;
}
var source = [
{
'name' : 'alpha',
'inner' : [
{
'name' : 'beta',
'inner' : [
{
'name' : 'gamma',
'inner' : [
{
'name' : 'one',
'inner' : []
}
]
}
]
}
]
},
{
'name' : 'alpha',
'inner' : [
{
'name' : 'beta',
'inner' : [
{
'name' : 'gamma',
'inner' : [
{
'name' : 'two',
'inner' : []
}
]
}
]
}
]
},
{
'name' : 'epsilon',
'inner' : [
{
'name' : 'one',
'inner' : []
}
]
},
{
'name' : 'epsilon',
'inner' : [
{
'name' : 'two',
'inner' : []
}
]
}
];
console.log(merge(source));