Javascript 按不同键中的特定值对数组中的对象排序
我有这个阵列-Javascript 按不同键中的特定值对数组中的对象排序,javascript,loops,sorting,filter,Javascript,Loops,Sorting,Filter,我有这个阵列- let array = [ { "id": 123, "pair": 312 }, { "id": 321, "pair": 111 }, { "id": 312, "pair": 123 }, { "id": 111, "pair": 321 } ]; 我需要像这样排序= let array = [ { "id": 123, "pair": 312 },
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;
}
};
性能方法(存储产品地图并根据其id查找每个产品的配对)-O(n*2):
直观的方法O(n^2):
//如果一对不存在,请查找下一对
常数arr=[];
for(设i=0;iitem.pair===products[i].id);
if(containsPair===false){
const productPair=products.slice(i).find({id}=>id==item.pair));
arr.push(…[产品[i],产品对]);
}
}
控制台日志(arr)
当链接到一起的项目数介于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"}
使用
数组#排序
是不可能的。你需要分组。顺便说一句,你尝试过什么?请展示你自己为解决这个问题所做的任何尝试,不管效率如何。@NinaScholz现在检查使用lodash像@4givN一样排序我需要一种方法来过滤两个键。没有一个我实际上尝试了你的两种方法,但它们都不起作用。这实际上是一种与我不同的情况,因为在我的例子中,只能有对,我的意思是两个项目之间只能有一个匹配,如果-arr[0]。productId===arr[1]。pairStock,这意味着arr[0[.pairStock==arr[1].productId此算法仍然有效,它会按升序对对对进行排序。输出将是{id:111,pair:321},{id:321,pair:111},{id:123,pair:312},{id:312,pair:123}
我在4个产品上尝试了此算法,函数返回了8个产品。请共享输入数据。我的错了,只是不起作用-输入是-[{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'}]
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"}