下面有2个json数组。
arrayA = [
{attr1: "text", attr2: true, field: "format4"},
{attr1: "text", attr2: true, field: "format2"},
{attr1: "text", attr2: true, field: "format1"},
{attr1: "text", attr2: true, field: "format3"}];
arrayB = [
{ name: 'format1', type: 'text' },
{ name: 'format2', type: 'text' },
{ name: 'format3', type: 'text' },
{ name: 'format4', type: 'text' }
];
我想按数组A的字段对数组B名称进行排序 我的目标是这样的
arrayB = [
{ name: 'format4', type: 'text' },
{ name: 'format2', type: 'text' },
{ name: 'format1', type: 'text' },
{ name: 'format3', type: 'text' }
];
我这样想,但这不是我的目标。
arrayB = arrayA.map((a) => {
return arrayB.filter((b) => {
return a.field === b.name
});
});
请给我一个完成我的目标的建议。
答案 0 :(得分:3)
如果您习惯使用ES6功能,可以使用Array.findIndex
获取索引并返回差异
var arrayA = [{attr1: "text", attr2: true, field: "format4"}, {attr1: "text", attr2: true, field: "format2"}, {attr1: "text", attr2: true, field: "format1"}, {attr1: "text", attr2: true, field: "format3"}];
var arrayB = [ { name: 'format1', type: 'text' }, { name: 'format2', type: 'text' }, { name: 'format3', type: 'text' }, { name: 'format4', type: 'text' }];
function getIndexInArrayA(name) {
return arrayA.findIndex(function(obj){ return obj.field === name})
}
arrayB.sort(function(a, b) {
return getIndexInArrayA(a.name) - getIndexInArrayA(b.name);
});
console.log(arrayB)

循环遍历数组并创建一个包含名称和索引的地图。这样您就不需要遍历数组来获取索引。
注意:这是更优选的,因为它涉及更少的迭代。从对象检索数据比获取索引表单数组更快。
var arrayA = [{attr1: "text", attr2: true, field: "format4"}, {attr1: "text", attr2: true, field: "format2"}, {attr1: "text", attr2: true, field: "format1"}, {attr1: "text", attr2: true, field: "format3"}];
var arrayB = [ { name: 'format1', type: 'text' }, { name: 'format2', type: 'text' }, { name: 'format3', type: 'text' }, { name: 'format4', type: 'text' }];
var indexNameMap = arrayA.reduce(function(acc, obj, i) {
acc[obj.field] = i;
return acc;
}, {})
arrayB.sort(function(a, b) {
return indexNameMap[a.name] - indexNameMap[b.name];
});
console.log(arrayB)

答案 1 :(得分:2)
您可以尝试以下
var arrayA = [{attr1: "text", attr2: true, field: "format4"}, {attr1: "text", attr2: true, field: "format2"}, {attr1: "text", attr2: true, field: "format1"}, {attr1: "text", attr2: true, field: "format3"}];
var arrayB = [ { name: 'format1', type: 'text' }, { name: 'format2', type: 'text' }, { name: 'format3', type: 'text' }, { name: 'format4', type: 'text' }];
// Create a temporary array of fields of array A
var tempArr = arrayA.map(function(item) {
return item.field;
});
// Create custom sort function to sort based on temp Arr
arrayB.sort(function(a, b) {
return tempArr.indexOf(a.name) - tempArr.indexOf(b.name);
})
console.log(arrayB);
答案 2 :(得分:0)
另一种解决方案:
const res = _.map(arrayA, a => _.find(arrayB, { name: a.field }));