2017-04-11 44 views
2

比方說,我有這樣一個數組:JS/lodash鴻溝陣列立足對象屬性

[ 
    { product: '...', price: 12 }, 
    { product: '...', price: 12 }, 
    { product: '...', price: 14 }, 
    { product: '...', price: 12 } 
] 

我想組此陣由價格和使用lodash的groupBy我會得到下面的結果:

[ 
    12: [ 
     { product: '...', price: 12 }, 
     { product: '...', price: 12 }, 
     { product: '...', price: 12 } 
     ], 
    14: [ 
     { product: '...', price: 14 } 
     ] 
] 

不錯,但我想有三個數組的數組,因爲我想保存某種順序相同的起步一樣陣列英寸我想得到這樣的結果:

[ 
    [ 
    { product: '...', price: 12 }, 
    { product: '...', price: 12 } 
    ], 
    [ 
    { product: '...', price: 14 } 
    ], 
    [ 
    { product: '...', price: 12 } 
    ] 
] 

是否有這樣的功能?

+0

請告訴我第一和產品的最後陣列之間的差異? –

+0

到目前爲止您嘗試過什麼?你可以添加你用過的代碼嗎? – evolutionxbox

+0

問題更復雜。我需要有這樣的結果。我作爲例子展示的數組遠比我需要處理的數組簡單得多。我嘗試了很多東西,如分組,過濾等。 – elzoy

回答

1

用純JS,你可以做到這一點使用forEach()循環,並保存在變量最後價格檢查,如果最後插入的元素具有相同的價格作爲當前一個。

var data = [ 
 
    { product: '...', price: 12 }, 
 
    { product: '...', price: 12 }, 
 
    { product: '...', price: 14 }, 
 
    { product: '...', price: 12 } 
 
] 
 

 
var result = [], last = null 
 
data.forEach(function(e, i) { 
 
    if(!this[e.price]) { 
 
    this[e.price] = [e]; 
 
    result.push(this[e.price]) 
 
    } else { 
 
    this[e.price].push(e) 
 
    } 
 
    if(last != e.price && i != 0) delete this[last] 
 
    last = e.price 
 
}, {}) 
 

 
console.log(result)

1

也許這個代碼將對你有幫助:

var myArray = [ 
 
    { product: '...', price: 12 }, 
 
    { product: '...', price: 12 }, 
 
    { product: '...', price: 14 }, 
 
    { product: '...', price: 12 } 
 
] 
 

 
var newArray = _.map(_.keyBy(myArray, "price")) 
 

 
console.log(newArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

2

你可以做這樣的事情使用lodash -

var count = 0; 
console.log(
_.values(_.groupBy(_.map(myArray, (item, index) => { 
     if(index == 0) return _.merge(item, { group : 0});; 
     if(myArray[index-1].price == item.price) 
      return _.merge(item, { group : count}); 
     return _.merge(item, { group : ++count}); 
     } 
    ), 'group')) 
); 

嘗試在這裏 - lodash-group-consequtive

1

你可以檢查最後插入陣列,並與實際價格測試中的第一項。如果匹配,則推送到最後一個數組,否則將新數組推送到結果集。

var data = [{ product: '...', price: 12 }, { product: '...', price: 12 }, { product: '...', price: 14 }, { product: '...', price: 12 }], 
 
    result = data.reduce(function (r, a) { 
 
     var last = r[r.length - 1] || [{}]; 
 
     if (last[0].price === a.price) { 
 
      last.push(a); 
 
     } else { 
 
      r.push([a]); 
 
     } 
 
     return r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }