基于另一个数组

时间:2016-03-06 05:25:14

标签: javascript arrays

我刚刚在这里发布了一个问题(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}
]

谢谢!

2 个答案:

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