我刚刚在这里发布了一个问题(Sorting/Filtering from 2 arrays),但我遇到了一个问题,因为我的ID可能是随机字符串:
所以我有一个包含所有数据的主数组:
var masterArray = [
{'id' : 'wedfd', 'title' : 'Title 1'},
{'id' : 'hji', 'title' : 'Title 2'},
{'id' : 'sdfds', 'title' : 'Title 3'},
{'id' : 'fgfgf', 'title' : 'Title 4'},
{'id' : 'kkd', 'title' : 'Title 5'},
{'id' : 'jjj', 'title' : 'Title 6'},
{'id' : 'abc', 'title' : 'Title 7'}
];
我得到一个包含此信息的数组:
var sortFilterInfo = [
{'id' : 'jjj', 'sortOrder' : 1},
{'id' : 'hji', 'sortOrder' : 2},
{'id' : 'abc', 'sortOrder' : 3}
]
有了这些信息,我需要一个数组,它给我这个已排序的过滤数组:(我只使用原生DOM数组方法(ES6)(map / filter / sort)和NOT Jquery,lodash等。
var resultArray = [
{'id' : 'jjj', 'title' : 'Title 6', 'sortOrder' : 1},
{'id' : 'hji', 'title' : 'Title 2', 'sortOrder' : 2},
{'id' : 'abc', 'title' : 'Title 7', 'sortOrder' : 3}
]
谢谢!
答案 0 :(得分:1)
您可以使用 map()
和 find()
(使用ES6箭头表示法)
var masterArray = [{
'id': 'wedfd',
'title': 'Title 1'
}, {
'id': 'hji',
'title': 'Title 2'
}, {
'id': 'sdfds',
'title': 'Title 3'
}, {
'id': 'fgfgf',
'title': 'Title 4'
}, {
'id': 'kkd',
'title': 'Title 5'
}, {
'id': 'jjj',
'title': 'Title 6'
}, {
'id': 'abc',
'title': 'Title 7'
}];
var sortFilterInfo = [{
'id': 'jjj',
'sortOrder': 1
}, {
'id': 'hji',
'sortOrder': 2
}, {
'id': 'abc',
'sortOrder': 3
}]
// if `sortFilterInfo` is not sorted then sort it using sort()
// sortFilterInfo.sort((a,b) => a.id-b.id)
// iterate over `sortFilterInfo` array for generating sorted array
var res = sortFilterInfo.map(v => {
// get element from `masterArray` based on the id
var obj = masterArray.find(v1 => v1.id == v.id);
// add sortOrder to the object
obj.sortOrder = v.sortOrder;
// return updated object
return obj;
});
document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>');
id
,然后使用 indexOf()
获取索引
var masterArray = [{
'id': 'wedfd',
'title': 'Title 1'
}, {
'id': 'hji',
'title': 'Title 2'
}, {
'id': 'sdfds',
'title': 'Title 3'
}, {
'id': 'fgfgf',
'title': 'Title 4'
}, {
'id': 'kkd',
'title': 'Title 5'
}, {
'id': 'jjj',
'title': 'Title 6'
}, {
'id': 'abc',
'title': 'Title 7'
}];
var sortFilterInfo = [{
'id': 'jjj',
'sortOrder': 1
}, {
'id': 'hji',
'sortOrder': 2
}, {
'id': 'abc',
'sortOrder': 3
}]
// if `sortFilterInfo` is not sorted then sort it using sort()
// sortFilterInfo.sort((a,b) => a.id-b.id)
// create an array with all id
var idArr=masterArray.map(v=>v.id);
// iterate over `sortFilterInfo` array for generating sorted array
var res = sortFilterInfo.map(v => {
// get element from `masterArray` based on the id
var obj = masterArray[idArr.indexOf(v.id)];
// add sortOrder to the object
obj.sortOrder = v.sortOrder;
// return updated object
return obj;
});
document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>');
答案 1 :(得分:1)
这是一种蛮力方法。如果sortFilterInfo按顺序排列,则此解决方案将始终有效。基本上只检查(从最低到最高顺序)如果它在masterArray中,如果是,则保证被推入结果数组的正确位置。
var masterArray = [
{'id' : 'wedfd', 'title' : 'Title 1'},
{'id' : 'hji', 'title' : 'Title 2'},
{'id' : 'sdfds', 'title' : 'Title 3'},
{'id' : 'fgfgf', 'title' : 'Title 4'},
{'id' : 'kkd', 'title' : 'Title 5'},
{'id' : 'jjj', 'title' : 'Title 6'},
{'id' : 'abc', 'title' : 'Title 7'}
];
var sortFilterInfo = [
{'id' : 'jjj', 'sortOrder' : 1},
{'id' : 'hji', 'sortOrder' : 2},
{'id' : 'abc', 'sortOrder' : 3}
];
var resultArray = [];
for(var i = 0; i < sortFilterInfo.length; i++) {
for(var j = 0; j < masterArray.length; j++) {
if (sortFilterInfo[i].id === masterArray[j].id) {
resultArray.push({id : masterArray[j].id, title: masterArray[j].title, sortOrder: sortFilterInfo[i].sortOrder});
}
}
}