2017-10-16 11 views
-1

私は何をしようとしているのでしょうか?私は配列(nameList)を持っていて、配列にはオブジェクトを保持しています。これらのオブジェクトは、人々の名前(Jack、Jane、James、Danielなど)とこれらの人々が関係している人物の配列(JackはJaneとDanielなどに関連しています)から構成されています。もちろん、1人の人は複数の人に関連することができますが、2人の子供は関連することはできません。私はそれらを木の中に入れておきたい、そして私はその木が関係に従うようにしたい。私は、ほとんどの関係を持つ人から始めたいと考えています(例えば、ダニエルは7人に関連しています)。ほとんどの関係を持つ人が1人以上いる可能性があります。しかし、私が求めている質問の簡潔さのために、私はそれが誰であるかを知っていると言うだけで、私はmostRelatedとしてそれを渡すでしょう。配列を使ったツリーの作成

This is just an example of what I want to do

は、これは私がそうfar.But私はそれを促進するかどうかは確認していない持っているものです。

//my array of names is nameList 
//to check who they are related to nameList.relatedTo 

function Node(names) { 
this.data = names; 
this.parent = null; 
this.children = []; 
} 

function CreateTree(nameList, mostRelated) 
{ 
this._root=mostLinked; 
    for(var i=0; i < nameList[i].length;i++) 
    { 
    node= new Node(nameList[i]); 
    if(nameList[i].isChecked!)//if already add to the tree 
    { 
     if(nameList[i].isRelated)//to check if they have any relation 
     { 
      for(var j=0; i < nameList[i].relatedTo[j].length;j++) 
      { 
       if(nameList[i].relatedTo.isChecked!) 
       { 
        nameList[i]=Node.parent; 
        Node.children.push(nameList[i].relatedTo[j]); 
        nameList[i].isChecked=true; 
        } 
      } 
     } 
    } 
    } 
} 

名前リストは、次のようにこの

nameList 
this.name; 
this.relatedTo=[]; 
this.related=false; 
this.checked=false; 
+2

このためにツリーを使用するのは適切なデータ構造ではありません.2人の子供が関連している場合はどうなりますか?あなたはグラフ/マップを使用する必要があります – ControlAltDel

+0

あなたの設定はどこにでもあります。あなたはすでに誰が誰の親/子供であるかを確立していませんか?あなたの情報が既に与えられているあなたのデータのグラフを作るために、あなたはすでにグラフを作っています。 'nameList'の要素の一例を挙げてください。私はあなたの目標を誤解しているかもしれません。 – Andrew

+0

@ControlAltDel、提案に感謝します。しかし、私は2人の子供が関連しないようにすることができます。私は質問を変更しました。 – JJD

答えて

0

何かのように見えますか?あなたの質問は根本的にグラフのデータ構造を求めていますが、偶然にもツリーのように見えます。

function Person(name) { 
    this.name = name 
    this.relatedTo = [] 
} 


function Graph(familyArr) { 
    this._familyArr = nameList.sort((a, b) => { 
    return b.relatedTo.length - a.relatedTo.length //reverse sort by relatedTo.length 
    }) 

    const familyObj = {} 
    this._familyArr.forEach(({name}) => { 
    familyObj[name] = new Person(name) //build object of name-person object key-val pairs 
    }) 
    this.head = familyObj[this._familyArr[0].name] //graphs don't have heads, but they can by 'coincidence' 
    this.family = familyObj // actual tree 
    this._children = Object.assign({}, this.family) //copies of children to keep proper track of them while building this.family 
} 

Graph.prototype.addRelative = function(parent, child) { 
    this.family[parent].relatedTo.push(this._children[child]) 
    // console.log(this.family); 
    return this 
} 

Graph.prototype.buildGraph = function() { 
    this._familyArr.forEach(parent => { 
    parent.relatedTo.forEach(child => { 
     this.addRelative(parent.name, child) 
    }) 
    }) 
} 

Graph.prototype.find = function(name) { 
    return this.family[name] 
} 

const john = {name: 'john', relatedTo: ['jane']} 
const jane = {name: 'jane', relatedTo: ['john']} 
const jack = {name: 'jack', relatedTo: ['andrew', 'jane']} 
const andrew = {name: 'andrew', relatedTo: ['jane', 'john']} 
const nameList = [john, jane, jack, andrew] 


const graph = new Graph(nameList) 
graph.buildGraph() 

console.log(graph.find('john')) 
// Person { 
// name: 'john', 
// relatedTo: [ Person { name: 'jane', relatedTo: [Object] } ] } 


console.log(graph.find('andrew')); 
// Person { 
// name: 'andrew', 
// relatedTo: 
// [ Person { name: 'jane', relatedTo: [Object] }, 
//  Person { name: 'john', relatedTo: [Object] } ] } 

console.log(graph.head) 
// Person { 
// name: 'jack', 
// relatedTo: 
// [ Person { name: 'andrew', relatedTo: [Object] }, 
//  Person { name: 'jane', relatedTo: [Object] } ] } 
+0

これは完璧です。私が求めていた以上のもの。ありがとうございました – JJD

関連する問題