2016-06-14 9 views
0

の新しい配列を作成します。私は、この外のオブジェクトの配列を抽出したいはJavaScript - 以下のように私は、オブジェクトの配列を持っている数と、オブジェクトの配列に一意の値を検索し、オブジェクト

var arr =[ 
{ 
    price:20, 
    rule:a 
}, 
{ 
    price:10, 
    rule:b 
}, 
{ 
    price:5, 
    rule:a 
}, 
{ 
    price:50, 
    rule:b 
}, 
{ 
    price:70, 
    rule:b 
} 
] 

以下の下:

var filteredArr = [ 
{ 
    rule:a, 
    countOfRule:2, 
    minPriceForThisRule:5 
}, 
{ 
    rule:b, 
    countOfRule:3, 
    minPriceForThisRule:10 
} 
] 

これが意味:私はなしで新しい配列を作成したい

1)。オブジェクトのユニークな番号として。最初の配列「ARR」

2の規則の)ユニークなルールの繰り返しをカウントして、新しい配列オブジェクトにプロパティとして追加する必要がある - 「countOfRule」

3として与えられた)の範疇にのための最低価格を探しますユニークなルール - "minPriceForThisRule"として与えられる

私はSOと同様の答えを読んで、最初の2つの条件だけを得ることができ、それも必要な形式ではありませんでした。私が試した何

、SO上のリンクを参照:

var ff = {},e; 
for (var i = 0,l=arr.length; i < l; i++) { 
    e = arr[i]; 
    ff[e.rule] = (ff[e.rule] || 0) + 1; 
} 

しかし、これはあなたがforEachthisArgオプションのパラメータでこれを行うことができます

{ 
a : 2, 
b: 3 
} 
+2

あなたが行ったことを私たちに教えてください! –

+0

@NafiulIslam - 更新しました。 – whyAto8

+0

@mplungjan - 申し訳ありませんが、私はそれを得ませんでした。もう少し説明してください。 – whyAto8

答えて

2

として単一のオブジェクトのみを提供します。

var arr = [{"price":20,"rule":"a"},{"price":10,"rule":"b"},{"price":5,"rule":"a"},{"price":50,"rule":"b"},{"price":70,"rule":"b"}], 
 
    r = []; 
 

 
arr.forEach(function(e) { 
 
    if(!this[e.rule]) { 
 
    this[e.rule] = {rule: e.rule, countOfRule: 0, minPriceForThisRule: e.price} 
 
    r.push(this[e.rule]); 
 
    } 
 
    this[e.rule].countOfRule++; 
 
    if(this[e.rule].minPriceForThisRule > e.price) this[e.rule].minPriceForThisRule = e.price; 
 
}, {}); 
 

 
console.log(r)

+0

ありがとう、私はこれを試してみましょう。 – whyAto8

+0

読みにくいが非常にエレガント – mplungjan

+0

ちょっと、これは完璧に動作します。どうもありがとうございます。 :-) – whyAto8

0

私は減らす使用します。必要であれば、もちろん

var map = { 
    1: { 
    rule: 1, 
    countOfRule: 0, 
    minPriceForThisRule: null  
    }, 
    2: { 
    rule: 2, 
    countOfRule: 0, 
    minPriceForThisRule: null   
    } 
} 

はあなたが動的にマップを作成することができます。最初のマップがどのように見える

var reduced = arr.reduce(function(memo, obj){ 
    var rule = memo[obj.rule]; 
    rule.countOfRule++; 
    if(!rule.minPriceForThisRule){ 
    rule.minPriceForThisRule = obj.price; 
    } else{ 
    if(obj.price < rule.minPriceForThisRule){ 
     rule.minPriceForThisRule = obj.price; 
    } 
    } 
    return memo; 
}, map); 

:ような何か。

https://plnkr.co/edit/wLw3tEx2SMXmYE7yOEHg?p=preview

0

これは

var arr =[ 
 
{ 
 
    price:20, 
 
    rule:"a" 
 
}, 
 
{ 
 
    price:10, 
 
    rule:"b" 
 
}, 
 
{ 
 
    price:5, 
 
    rule:"a" 
 
}, 
 
{ 
 
    price:50, 
 
    rule:"b" 
 
}, 
 
{ 
 
    price:70, 
 
    rule:"b" 
 
} 
 
], 
 
reduced = arr.reduce((p,c) => { var fo = p.find(f => f.rule == c.rule); 
 
           fo ? (fo.countOfRule++, 
 
             fo.minPriceForThisRule > c.price && (fo.minPriceForThisRule = c.price)) 
 
            : p.push({rule:c.rule, countOfRule:1, minPriceForThisRule: c.price}); 
 
           return p; 
 
           },[]); 
 
console.log(reduced);

矢印はIEやSafariで動作しない可能性があります、私はこの仕事をするだろうかです。それが問題になる場合は、従来の対応物と交換してください。

関連する問題