2016-12-06 22 views
0
  • 最後にnameごとに1つのオブジェクトのみが必要です。
  • 複数のオブジェクトが同じ名前である場合は、各オブジェクトのnumber配列が1つのオブジェクトに結合し得るよう
  • その名前のためにそれを作ると同じ名前を持つ一つの目的はnumberに重複要素を持つべきではありませんアレイ。
  • 番号配列の要素は、元の配列に表示される順序と同じ順序で表示されます。配列内のオブジェクトを結合し、オブジェクト内の配列にプッシュ

    var arrT = [ 
        {name : "x.com", number :["123-456-789"]}, {name : "x.com", number :["452-123-789"]},{name : "y.com", number :["123-456-000"]}, 
        {name : "x.com", number :["123-456-789"]}, {name : "y.com", number :["123-456-000"]}, {name : "b.com", number :["178-456-000"]} 
    
    
        ] 
    
    output should be:[ 
    {name : "x.com", number : ["123-456-789", "452-123-789"]}, //notice: 123-456-789 didn't appear twice 
    {name : "y.com", number : ["123-456-000"]}, 
    {name : "b.com", number :["178-456-000"]} 
    
    ] 
    

私は、同じ名前のオブジェクトが

var occurrences = nArr.reduce(function(acc, curr,i){ 
    if(typeof acc[curr.name] == "undefined"){ 
     acc[curr.name] = 1; 
    }else{ 
     acc[curr.name] += 1 
    } 
    return acc; 
}, {}); 
console.log(occurrences) 

var moreThanOne = []; 
for(var key in occurrences){ 
    if(occurrences[key] > 1){ 
     moreThanOne.push(key); 
    } 
} 
console.log("moreThanOne", moreThanOne) 

を発生したが、私は重複を削除する方法を知りませんでしたので、それが複雑になった回数を知ることができたと1つを残して、numberの配列を組み合わせる

+0

とああ。私はちょうど減らすことでこれをすることができると今考えていた。カウント部分を忘れて –

答えて

0

いくつかの制約があるのか​​どうかはわかりませんが、それは私がやる方法です。

オブジェクト全体をループし、オブジェクトに配置します。オブジェクトのキーは名前になります。オブジェクトが存在していないかどうかを確認し、を[number]で置き換えます。オブジェクトがすでに存在する場合は、pushの数値を追加します。

すべてのオブジェクトをループしたら、そのオブジェクトをリストに変換してください。それだけです。ない場合は、あなたの代わりにオブジェクトを変更し、既存の軽減機能でコピーする必要があります

function groupByName(accum, obj) { 
    if (accum[obj.name]) { 
    // add all numbers! don't check for uniqueness yet 
    accum[obj.name].number = accum[obj.name].concat(obj.number) 
    } else { 
    accum[obj.name] = obj 
    obj.number = [obj.number] 
    } 
    return accum 
} 

function removeDuplicates(accum, value) { 
    if (accum.length == 0 && accum[accum.length - 1] != value) { 
    accum.push(value) 
    } 
    return accum 
} 

function toList(context) { 
    return function (key) { 
    var obj = context[key] 
    obj.number.sort() 
    obj.number = obj.number.reduce(removeDuplicates, []) 
    return obj 
    } 
} 

objs = arrT.reduce(groupByName, {}) 
output = Object.keys(objs).map(toList(objs)) 

これらのオブジェクトのための使用はどこにも存在しない場合、それは大丈夫ですので、私は最初のオブジェクトをedidingよ注意を...。

+0

ありがとう。これは参考になります。 –

+0

ああ、私は 'number'がすでに配列であるのを見たことがありませんでした...そして、あなたはすべての数字をループして、それらが既にそこにあるかどうかを確認しなければなりません。 –

0

あなただけのユニークな数字を維持したい場合は、あなただけの数字がすでにあるかどうかを確認する必要があります。

この例では、最初に新しいオブジェクトを作成し、チェックしそうでないときに名前が、すでに存在している場合存在する場合は完全に新しい参照(番号配列を含むので、元のソースは同じままです)として追加します。存在する場合は、番号配列をループして、どの配列をまだ追加するかを確認します。

var arrT = [{ 
 
    name: "x.com", 
 
    number: ["123-456-789"] 
 
}, { 
 
    name: "x.com", 
 
    number: ["452-123-789"] 
 
}, { 
 
    name: "y.com", 
 
    number: ["123-456-000"] 
 
}, { 
 
    name: "x.com", 
 
    number: ["123-456-789"] 
 
}, { 
 
    name: "y.com", 
 
    number: ["123-456-000"] 
 
}, { 
 
    name: "b.com", 
 
    number: ["178-456-000"] 
 
}]; 
 

 
var reduced = arrT.reduce((nextState, item) => { 
 
    var key = item.name, 
 
    o; 
 
    if (!(o = nextState[key])) { 
 
    // clones the item, and the number array 
 
    nextState[key] = { ...item, number: [...item.number] }; 
 
    } else { 
 
    item.number.forEach(number => o.number.indexOf(number) === -1 && o.number.push(number)); 
 
    } 
 
    return nextState; 
 
}, {}); 
 

 
console.log(arrT); 
 
console.log(Object.keys(reduced).map(key => reduced[key]));

+0

数字リストが成長するにつれて、時間。それは人が1000の数字を持っている可能性は低いので大したことではありませんが、あなたがすべての数字を蓄積したら、あなたは1回の数字をフィルタリングする方が良いでしょう。 –

+0

@LoïcFaure-Lacroixええ、それは当然のことですが、現在のデータセットでは、これは "大きな"ものではありませんが、私はあなたのポイントを見ることができます – Icepickle

0

ミックスのためのもう一つの(ES6)バージョン:MapSets

let arrT = [{name : "x.com", number :["123-456-789"]}, {name : "x.com", number :["452-123-789"]},{name : "y.com", number :["123-456-000"]}, {name : "x.com", number :["123-456-789"]}, {name : "y.com", number :["123-456-000"]}, {name : "b.com", number :["178-456-000"]} ]; 
 
    
 
let res = [...arrT.reduce((m,o) => { 
 
    let set = m.get(o.name); 
 
    if(!set) m.set(o.name, set = new Set()); 
 
    for(let n of o.number) set.add(n); 
 
    return m; 
 
}, new Map())] 
 
.map(([na,[...nrs]])=>({name:na,number:nrs})); 
 
    
 
console.log(res);

関連する問題