javascript - 按不同键中的特定值对对象数组进行排序
问题描述
我有这个数组 -
let array = [
{
"id": 123,
"pair": 312
},
{
"id": 321,
"pair": 111
},
{
"id": 312,
"pair": 123
},
{
"id": 111,
"pair": 321
}
];
我需要它像这样排序=
let array = [
{
"id": 123,
"pair": 312
},
{
"id": 312,
"pair": 123
},
{
"id": 321,
"pair": 111
},
{
"id": 111,
"pair": 321
}
];
这意味着我需要在对象中找到配对键的匹配值,并将其放在第一个元素之后(最终我需要成对排序 - 当然数组会更大并且混合)我找不到有效的方法来实现这一目标。
这就是我尝试过的 - 感觉非常低效
products 是我从服务器获得的数组。
let pairs = [];
let prods = [...products];
for(let product of prods){
if(product.matched){
continue;
}
let pairStock = product.pairStock;
let companyId = product.company;
let matched = prods.filter(prod => prod.productId === pairStock && String(prod.company) === String(companyId));
if(matched.length > 0){
pairs.push(product);
pairs.push(matched[0]);
let index = prods.findIndex(prod => prod.productId === matched[0].productId);
prods[index].matched = true;
}
};
解决方案
当链接在一起的项目数介于0
和之间时,这将对数据进行排序array.length
。
let products = [
{ productId: 'PK0154', pairStock: 'PK0112-02' },
{ productId: 'PK0112-02', pairStock: 'PK0154' },
{ productId: 'MGS-140', pairStock: 'MGS-136' },
{ productId: 'GM-0168', pairStock: 'GM-0169' },
{ productId: 'GM-0169', pairStock: 'GM-0168' },
{ productId: 'MGS-136', pairStock: 'MGS-140' },
]
function sort(data) {
var mappedArray = {}
data.forEach(obj => (mappedArray[obj.productId] = obj))
data.sort((a, b) => a.productId.localeCompare( b.productId) )
var addToRes = (res, id) => {
if (id !== undefined && mappedArray[id] !== undefined) {
var obj = mappedArray[id]
mappedArray[id] = undefined
res.push(obj)
addToRes(res, obj.pairStock)
}
}
var result = []
data.forEach(item => addToRes(result, item.productId))
return result
}
console.log(sort(products))
其结果
0: {productId: "GM-0168", pairStock: "GM-0169"}
1: {productId: "GM-0169", pairStock: "GM-0168"}
2: {productId: "MGS-136", pairStock: "MGS-140"}
3: {productId: "MGS-140", pairStock: "MGS-136"}
4: {productId: "PK0112-02", pairStock: "PK0154"}
5: {productId: "PK0154", pairStock: "PK0112-02"}
推荐阅读
- java - 如何使用 java 8 在 HashMaps 列表上进行多重聚合
- javascript - 如何隐藏 Blueprint.js 开关组件周围的边框?
- r - R-通过根据条件删除重复项来创建数据集 - 过滤器
- python - 如何将 p 标签合并为一行 - beautfiulsoup
- javascript - 幻灯片自动播放和通过点选择的能力
- python - 父级上的 Odoo 扩展菜单项不会出现
- java - 如何使用 opennebula API 在 VirtualBox 上管理 opennebula 沙箱
- ios - 在 watchOS 中设置 MPRemoteCommandCenter 现在正在使用 WKAudioFilePlayer 播放
- angular - Agm-marker 双击事件
- spring-mvc - 在名称为 '' 的 DispatcherServlet 中找不到具有 URI [/api/transactions] 的 HTTP 请求的映射