我想从一个对象数组中创建一个对象数组,这是数据:
// Input:
const shippingMethodOptions = [{
id: 1,
carrier_token: 'fedex',
carrier_name: 'Fedex',
weight: 1,
price: 3
}, {
id: 2,
carrier_token: 'fedex',
carrier_name: 'Fedex',
weight: 2,
price: 6
}, {
id: 3,
carrier_token: 'fedex',
carrier_name: 'Fedex',
weight: 6,
price: 9
}, {
id: 4,
carrier_token: 'usps',
carrier_name: 'Usps',
weight: 6,
price: 9
}, {
id: 5,
carrier_token: 'delaware',
carrier_name: 'Delaware',
weight: 5,
price: 10
}]
正如您所看到的数据有carrier_token
和carrier_name
,我想要的是创建一个具有唯一carriers
的输出数组,如下所示:
// Output:
const carriers = [{
carrier_token: 'fedex',
carrier_name: 'Fedex'
}, {
carrier_token: 'usps',
carrier_name: 'USPS'
}, {
carrier_token: 'delaware',
carrier_name: 'Delaware'
}]
我试过用for循环构建它,但是我想知道这是否可以以更干净的方式进行(减少?)
这是我目前的解决方案(但同样,我很想知道是否可以通过Reduce等使其更清洁。)
const getCarriers = options => {
const carriers = []
options.forEach(({ carrier_token, carrier_name }) => {
const foundIndex = _.findIndex(carriers, carrier => carrier.carrier_token === carrier_token)
if (foundIndex !== -1) {
return
}
carriers.push({
carrier_token,
carrier_name
})
})
return carriers
}
const carriers = getCarriers(shippingMethodOptions)
答案 0 :(得分:6)
似乎是一个非常简单的 reduce 工作。
您需要的是一种跟踪现有运营商的方法。我建议使用Set
并存储由令牌和名称制作的密钥,例如在"<token>:<name>"
之类的字符串中。
const shippingMethodOptions = [{"id":1,"carrier_token":"fedex","carrier_name":"Fedex","weight":1,"price":3},{"id":2,"carrier_token":"fedex","carrier_name":"Fedex","weight":2,"price":6},{"id":3,"carrier_token":"fedex","carrier_name":"Fedex","weight":6,"price":9},{"id":4,"carrier_token":"usps","carrier_name":"Usps","weight":6,"price":9},{"id":5,"carrier_token":"delaware","carrier_name":"Delaware","weight":5,"price":10}]
const carriers = shippingMethodOptions.reduce(function(arr, smo) {
let key = `${smo.carrier_token}:${smo.carrier_name}`
return this.has(key) ? arr : this.add(key) && arr.concat({
carrier_token: smo.carrier_token,
carrier_name: smo.carrier_name
});
}.bind(new Set()), [])
console.info(carriers)
&#13;
我将Set
绑定到reduce
回调,因此可以通过this
关键字使用它,但您可以在回调范围和商店之外轻松创建它它在变量中,例如
const keys = new Set()
答案 1 :(得分:3)
我考虑将.reduce()
与Map()
一起使用,其中地图条目包含基于${carrier_token}:${carrier_name}
的键和所需对象格式的值。然后在地图的Array.from()
上使用.values()
。
const shippingMethodOptions = [{"id":1,"carrier_token":"fedex","carrier_name":"Fedex","weight":1,"price":3},{"id":2,"carrier_token":"fedex","carrier_name":"Fedex","weight":2,"price":6},{"id":3,"carrier_token":"fedex","carrier_name":"Fedex","weight":6,"price":9},{"id":4,"carrier_token":"usps","carrier_name":"Usps","weight":6,"price":9},{"id":5,"carrier_token":"delaware","carrier_name":"Delaware","weight":5,"price":10}]
const carriers = Array.from(
shippingMethodOptions.reduce((map, {carrier_token, carrier_name}) => {
const key = `${carrier_token}:${carrier_name}`
if (!map.has(key)) map.set(key, { carrier_token, carrier_name })
return map
}, new Map()).values()
)
console.log(carriers)
或者,只要carrier_token
足以实现唯一性,您就可以简化它:
const shippingMethodOptions = [{"id":1,"carrier_token":"fedex","carrier_name":"Fedex","weight":1,"price":3},{"id":2,"carrier_token":"fedex","carrier_name":"Fedex","weight":2,"price":6},{"id":3,"carrier_token":"fedex","carrier_name":"Fedex","weight":6,"price":9},{"id":4,"carrier_token":"usps","carrier_name":"Usps","weight":6,"price":9},{"id":5,"carrier_token":"delaware","carrier_name":"Delaware","weight":5,"price":10}]
const carriers = Array.from(
shippingMethodOptions.reduce((map, {carrier_token, carrier_name}) => {
if (!map.has(carrier_token)) map.set(carrier_token, { carrier_token, carrier_name })
return map
}, new Map()).values()
)
console.log(carriers)