2017-02-15 12 views
1

の値をマージ:私がやっている何重複を削除し、私はそうのようなjavascript配列を持つJavascript配列

var recipients = [{ 
    name: 'Michael', 
    task: 'programming', 
    contactdetails: '[email protected]' 
}, { 
    name: 'Michael', 
    task: 'designing', 
    contactdetails: '[email protected]' 
}, { 
    name: 'Shane', 
    task: 'designing', 
    contactdetails: '[email protected]' 
}]; 

は、私はこの一週間のある人のための通知を送信rosteringシステムなので、メールです「こんにちはマイケル、あなたは今週番組を作ります」のようなものです。現時点では、配列内のすべての値について電子メールを送信するため、それはあまり役に立ちません。したがって、上記の例では、Michael 2の電子メールを送信します。

私がしたいのは、タスクのプロパティ文字列をマージする際に重複を削除することです。だから、配列は次のようになります。

var recipients = [{ 
    name: 'Michael', 
    task: 'programming, designing', 
    contactdetails: '[email protected]' 
}, { 
    name: 'Shane', 
    task: 'designing', 
    contactdetails: '[email protected]' 
}]; 

そのように、それだけで「こんにちはマイケル、あなたが今週設計、プログラミングしている」のように一つのメッセージを送ることができます。これについてどうすればいいですか?私もGoogle Appsスクリプトを使用していますので、純粋なjavascriptソリューションが必要です。マイケルは決して別のメールアドレスなどを持っていないので、各人の名前と電子メールアドレスは常に同じであると付け加えるべきです。

+0

私たちは一意のキーは 'contactdetails'フィールドだと仮定できますか?または 'contactdetails'と' name'フィールドの両方か? – haxxxton

+0

情報をコメントとして追加しないで、質問に入れてください。また、Googleアプリスクリプトタグを追加します。おそらく[* reduce *](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)は仕事をしますが、何を試しましたか? – RobG

+0

@haxxxtonはい名前と連絡先の詳細はそれぞれの人のために常に同じですが、唯一のことは人のために変わるでしょう。 – user1190132

答えて

3

これは、reduce機能を使用する良い機会です。

元の受信者リストのそれぞれを循環させ、要素をすでに処理しているかどうかを確認し、すでに処理されている要素に現在の要素のタスクを追加します。処理リスト

// original array 
var recipients = [ 
    {name: 'Michael',task:'programming',contactdetails:'[email protected]'}, 
    {name: 'Michael',task:'designing',contactdetails:'[email protected]'}, 
    {name: 'Shane',task:'designing',contactdetails:'[email protected]'} 
]; 
var recipientKeyList = []; // used to store the contacts we've already processed 
// cycle through each recipient element 
var newRecipients = recipients.reduce(function(allRecipients, recipient){ 
    // get the indexOf our processed array for the current recipient 
    var index = recipientKeyList.indexOf(recipient.contactdetails); 
    // if the contact details already exist, append the task 
    if(index >= 0){ 
     allRecipients[index].task = allRecipients[index].task + ', ' + recipient.task; 
     return allRecipients 
    }else{ // otherwise append the recipient 
     recipientKeyList.push(recipient.contactdetails) 
     return allRecipients.concat(recipient); 
    } 

}, []); 
+0

すばらしい答えがたくさんありましたが、私は時間をかけてさまざまなオプションを消化しますが、このコードはうまく機能します。あなたの助けをありがとうございます:) – user1190132

+1

これは、私が、不要なグローバルを避けるためにIIFEでラップしたことを除いて、私がやったこととほぼ同じです。 ;-) – RobG

+0

@RobG、OPにはすでにIIFEでラップされているコードのスニペットが含まれていることを期待しています; – haxxxton

1
var recipients = [{name: 'Michael',task:'programming',contactdetails:'[email protected]'},{name: 'Michael',task:'designing',contactdetails:'[email protected]'},{name: 'Shane',task:'designing',contactdetails:'[email protected]'}]; 

var tempObj = {}; 
for (i=0; i<recipients.length; i++) { 
    if (!tempObj[recipients[i]['name']]) { 
     tempObj[recipients[i]['name']] = {}; 
     tempObj[recipients[i]['name']]['task'] = []; 
    } 
    tempObj[recipients[i]['name']]['task'].push(recipients[i]['task']); 
    tempObj[recipients[i]['name']]['contactdetails'] = recipients[i]['contactdetails']; 
} 

var new_arr = []; 
Object.keys(tempObj).forEach(function(key) { 
    new_arr.push({name: key, task: tempObj[key]['task'].join(", "), contactdetails: tempObj[key]['contactdetails']}) 
}); 
+0

このコードで何をしているのか説明できますか? – Sikorski

+0

さて、私は配列の上にループし、名前でユニークなものを取り出し、タスク名を集約します。 – kawadhiya21

+0

さらに、タスク名を "、"で結合して、配列形式で配列します。 – kawadhiya21

1

nameとしてキーを持つオブジェクトに変換配列(また、電子メールすることができます)

// original array 
 
var recipients = [ 
 
    {name: 'Michael',task:'programming',contactdetails:'[email protected]'}, 
 
    {name: 'Michael',task:'designing',contactdetails:'[email protected]'}, 
 
    {name: 'Shane',task:'designing',contactdetails:'[email protected]'} 
 
]; 
 

 
var recipientsObj = {}; 
 
for (var i = 0; i < recipients.length; i++) { 
 
    var element = recipients[i]; 
 
    var recipientInObj = recipientsObj[element.name] 
 
    if (recipientInObj) { 
 
    // If a recipient is repeated with same task, here duplicates will appear 
 
    recipientInObj.task += ', ' + element.task; 
 
    } else { 
 
    recipientsObj[element.name] = element; 
 
    } 
 
} 
 
console.log(recipientsObj)

+0

すぐに参加するだけの配列を作成することは、残虐ではないようですね? – haxxxton

+0

追加された文字列コンカチェット代替 – Sangharsh

+0

'... + = '、' + recipientsObj [element.name] .task;'は入力するのがずっと少ないです。 ;-) – RobG

1

反復処理し、その後、この

などのタスクを追加する場合は、同じオブジェクトを探します

var recipients = [{ 
 
    name: 'Michael', 
 
    task: 'programming', 
 
    contactdetails: '[email protected]' 
 
}, { 
 
    name: 'Michael', 
 
    task: 'designing', 
 
    contactdetails: '[email protected]' 
 
}, { 
 
    name: 'Shane', 
 
    task: 'designing', 
 
    contactdetails: '[email protected]' 
 
}]; 
 

 

 
var uniqueR = []; 
 
var copyRecipients = JSON.parse(JSON.stringify(recipients)); 
 

 
copyRecipients .forEach(function(ele){ 
 
    var obj = uniqueR.find(function(e){ 
 
    return (e.name == ele.name && e.contactdetails == ele.contactdetails); 
 
    }); 
 
    if(obj){ 
 
    obj.task = obj.task + ", " + ele.task; 
 
    }else{ 
 
    uniqueR.push(ele); 
 
    } 
 
}); 
 

 
console.log(uniqueR)

+0

これは、* recipient *と* uniqueR *のオブジェクト間のリンクを作成します。つまり、* recipients *も変更しています(つまり、* uniqueR *と* recipients *は、関数によって変更された全く同じオブジェクトを含みます。 .log(受信者) ')。おそらく、他の答えごとにオブジェクトをコピーする必要があります。 – RobG

+0

はいいいえ合意が合意しました –

0

するvar newJSON = {}; $ .each(受信者、関数(i、json)){ newJSON [json.contactdetails] = {名前:json ["name"]、タスク:newJSON [json.contactdetails]!=未定義& & newJSON [json.contactdetails ] ["task"]!=未定義?newJSON [json.contactdetails] ["task"] + "、" json ["task"]:json ["task"]}

});

+0

OPには "純粋なjavascriptソリューション" – haxxxton

関連する問題