我怎么能按其他数组排序数组

时间:2018-01-31 04:57:16

标签: javascript angular lodash

下面有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 
    });
});

请给我一个完成我的目标的建议。

3 个答案:

答案 0 :(得分:3)

如果您习惯使用ES6功能,可以使用Array.findIndex获取索引并返回差异

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)




HashMap中

循环遍历数组并创建一个包含名称和索引的地图。这样您就不需要遍历数组来获取索引。

注意:这是更优选的,因为它涉及更少的迭代。从对象检索数据比获取索引表单数组更快。



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 }));