2015-03-31 106 views
0

我有表示相同的數據這2個陣列:不均勻的陣列,如concatAll功能

array1 = [ 
    {name: "max", age: 30}, 
    {name: "paul"}, 
    {name: "paul.Jack", age: 25}, 
    {name: "max.David"}, 
    {name: "max.Sylvia", age: 27}, 
    {name: "paul.Jack.Ned"}, 
    {name: "paul.Jack.Mike"}, 
    {name: "max.David.Jeff"}, 
    {name: "max.Sylvia.Anna", age: 5}, 
    {name: "max.David.Buffy"}, 
    {name: "max.Sylvia.Craig"}, 
    {name: "max.Sylvia.Robin"} 
]; 
array2 = [ 
    { 
     name: "max", 
     age: 30, 
     children: [ 
     { 
      name: "Sylvia", 
      age: 27, 
      children: [ 
      {name: "Anna", age: 5}, 
      {name: "Craig"}, 
      {name: "Robin"} 
      ] 
     }, 
     { 
      name: "David", 
      children: [ 
      {name: "Jeff"}, 
      {name: "Buffy"} 
      ] 
     } 
     ] 
    }, 
    { 
     name: "paul", 
     children: [ 
     { 
      name: "Jack", 
      age: 25, 
      children: [ 
      {name: "Ned"}, 
      {name: "Mike"} 
      ] 
     } 
     ] 
    } 
    ]; 

我的目標是具有不均勻的一個函數,它變換ARRAY1到數組2,我使用的lodash到做到這一點這裏的地方我現在是:
unEven數組1到數組2在這種情況下,「名稱」包含有關禁止新的數組中此項目應推動信息的跟蹤性能檢查這個js bin,這項工作對於3級嵌套數組,但我的目標是讓它不受嵌套級別的限制,這就是我卡住的地方。
unEven函數將像這個video中的concatAll函數一樣。
這裏的不均勻功能:

Array.prototype.unEven = function (trackingProperty, children, resultArray) { 
    var newItem, prop, index, parent, subParent, subParentIndex; 
    resultArray = resultArray || []; 
    this.forEach(function (item) { 
    newItem = lodash.omit(item, trackingProperty); 
    prop = lodash.pick(item, trackingProperty); 
    if (prop[trackingProperty].indexOf('.') === -1) { 
     resultArray.push(item); 
    } else { 
     newItem[trackingProperty] = prop[trackingProperty].split("."); 
     parent = {}; 
     parent[trackingProperty] = newItem[trackingProperty][0]; 
     index = lodash.indexOf(resultArray, lodash.find(resultArray, parent)); 
     if (newItem[trackingProperty].length === 2) { 
     newItem[trackingProperty] = newItem[trackingProperty][1]; 
     if (!Array.isArray(resultArray[index][children])) { 
      resultArray[index][children] = []; 
     } 
     resultArray[index][children].push(newItem); 
     } else if (newItem[trackingProperty].length === 3) { 
     subParent = {}; 
     subParent[trackingProperty] = newItem[trackingProperty][1]; 
     subParentIndex = lodash.indexOf(resultArray[index][children], lodash.find(resultArray[index][children], subParent)); 
     newItem[trackingProperty] = newItem[trackingProperty][2]; 
     if (!Array.isArray(resultArray[index][children][subParentIndex][children])) { 
      resultArray[index][children][subParentIndex][children] = []; 
     } 
     resultArray[index][children][subParentIndex][children].push(newItem); 
     } 
    } 
    }); 
    return resultArray; 
}; 

給我的使用情況這個我想使我的應用程序angular ui router將從路由JSON文件生成一個d3js tree layout,因爲我做的路由JSON文件。

+1

爲什麼不使用jQuery.extend?看到這裏:http://jsbin.com/pujuniweje/1/edit?js,console – Fourat 2015-03-31 10:56:14

+0

這不會做我想要的我想要將array1轉換爲array2不擴展它們或將它們合併在一起。 檢查我提供的http://jsbin.com/welesoqige/2/edit?js,console並沒有給出與您的輸出相同的輸出。 – 2015-03-31 11:02:18

+0

對不起,我覺得我不明白這件不可思議的事情。但是你說有一個跟蹤屬性,可以用它來映射array2中的對象,換句話說,您需要將元素的子項與名稱相加,並將它們添加到當前對象中。 我提供的代碼做了你想要的名字是最大的一個元素。 這是一個pastebin(第一個對象是你的,第二個是我的):http://pastebin.com/kEsZJn1Q – Fourat 2015-03-31 11:15:45

回答

2

這裏是一個lodash沉重的解決方案,我認爲做你想做的。如果您不關心變異原始數組,您可以跳過克隆,如果您的父母始終在原始數組之後始終有孩子,則可以跳過排序。

function unEven(array1) { 
    _(_.clone(array1, true)) //begin chaining syntax, with cloned array 
    .each(function(person) { 
     person.name = person.name.split(".") //replace name with array of names 
    }) 
    .sortBy(function(person) {return person.name.length}) //sort so that we handle children after parents 
    .reduce(function(result, person) { 
     var parentArray = result; 
     var name = person.name.pop() //their actual name is the last one in the list 
     _.each(person.name, function(parentName) { //loop through parent names to find the proper array to add to 
      var parent = _.find(parentArray, {name: parentName}); 
      if(!parent) throw new Error(name + " has non-existent parent "+parentName); 
      parentArray = parent.children = parent.children || [] 
     }) 
     person.name = name; //return name back to just being their name 
     parentArray.push(person); 
     return result; 
    }, []) //reduce ends chaining syntax; so no need for .value 
}