我想比较两个列表,如果第一个列表的值与第二个列表的代码相对应,则有必要根据比较的值对第二个列表进行排序
第一个列表:
var List1 = [{id : "idValue2"}, {id : "idValue5"}]
第二个列表(排序之前)
var List2 = [
{code : "idValue1", label: "value1"},
{code : "idValue2", label: "value2"},
{code : "idValue3", label: "value3"},
{code : "idValue4", label: "value4"};
{code : "idValue5", label: "value5"}]
比较list1 id和list2代码后,将对list2进行排序
第二个列表(排序后)
var List2 = [
{code : "idValue2", label: "value2"},
{code : "idValue5", label: "value5"}
{code : "idValue1", label: "value1"},
{code : "idValue3", label: "value3"},
{code : "idValue4", label: "value4"}]
idValue2 和 idValue5 位居第一。
您有解决方案吗?
答案 0 :(得分:2)
尝试这样。只需filter
和some
即可为您提供所需的数组,最后并置两个数组
var List1 = [{id : "idValue2"}, {id : "idValue5"}]
var List2 = [
{code : "idValue1", label: "value1"},
{code : "idValue2", label: "value2"},
{code : "idValue3", label: "value3"},
{code : "idValue4", label: "value4"},
{code : "idValue5", label: "value5"}
]
var a = List2.filter(x=> ( List1.some(y=> { return y.id == x.code }) ));
var b = List2.filter(x=> ( !List1.some(y=> { return y.id == x.code }) ))
var list3 = a.concat(b);
console.log(list3);
答案 1 :(得分:1)
这是一个简单但可能并非真正有效的解决方案。基本上,您有两个嵌套的release
循环,它们循环遍历List1和List2。如果id和代码相似,则将List2的元素压入结果数组,并从List2的副本中删除此元素。为什么要复制?因此,在迭代List2时,我们不会对其进行修改。
最后,结果(排序项)和copyList2(其余未排序项)通过for
连接在一起。
concat
答案 2 :(得分:0)
您可以将ID作为值存储在临时数组中。然后在list2-array上使用自定义排序功能来比较代码在temp-array中的位置:
let list1 = [{id : "idValue2"}, {id : "idValue5"}];
let list2 = [
{code : "idValue1", label: "value1"},
{code : "idValue2", label: "value2"},
{code : "idValue3", label: "value3"},
{code : "idValue4", label: "value4"},
{code : "idValue5", label: "value5"}
];
let tempArray = [];
for (let obj of list1) {
tempArray.push(obj.id);
}
list2.sort(function(a, b) {
let iA = tempArray.indexOf(a.code);
let iB = tempArray.indexOf(b.code);
if (iA == iB) {
return 0;
}
if (iA == -1) {
return 1;
}
if (iB == -1) {
return -1;
}
if (iA < iB) {
return -1;
}
if (iA > iB) {
return 1;
}
});
console.log(list2);