基于两个不同的数组创建新数组(匹配值)

时间:2016-10-09 15:00:51

标签: javascript arrays

我在JavaScript中有两个数组,我想根据第一个数组的顺序重新安排一个。

第一个阵列:

var arrayOne = [ 
        "5", 
        "1", 
        "2", 
        "4"
    ]
我希望根据与arrayOne匹配的page_id重新排列的

第二个数组

var arrayTwo = [ 
    {
        "page_id" : "5",
        "page_title" : "About"
    },
    {
        "page_id" : "2",
        "page_title" : "Home"
    }, 
    {
        "page_id" : "4",
        "page_title" : "Contact Us"
    }, 
    {
        "page_id" : "1",
        "page_title" : "Gallery"
    }, 
];

重新安排后 我想基于page_id重新排列arrayTwo,所以一旦重新排列第二个数组就会看起来像:

var arrayTwo = [
    {
        "page_id" : "5",
        "page_title" : "About"
    },
    {
        "page_id" : "1",
        "page_title" : "Gallery"
    }, 
    {
        "page_id" : "2",
        "page_title" : "Home"
    }, 
    {
        "page_id" : "4",
        "page_title" : "Contact Us"
    }, 

];

我在这一点上非常困难,我在这里发现了许多排序'解决方案'和谷歌,但它们似乎没有用。我已经尝试使用for循环来做到这一点,但我并没有真正得到任何结果。我通常不会寻求帮助,但我已经被困了3个小时的搜索。

第一个匹配在第二个匹配page_id,所以我可以使用匹配,但如上所述,我很困难。

非常感谢任何帮助,谢谢!

5 个答案:

答案 0 :(得分:0)

首先将第二个数组转换为对象 - 键将是page_id,例如:

var map = arrayTwo.reduce((a, b) => {
  a[b.page_id] = b;
  return a;
}, {});

现在我们可以轻松地map第一个数组,例如:

arrayOne.map(x => map[x]);

工作示例:http://jsbin.com/tiyudutasi/edit?js,console

答案 1 :(得分:0)

您可以使用Array.prototype.map()来迭代arrayOneArray.prototype.filter()来匹配arrayTwo的对象page_id等于当前arrayOne

var arrayOne = [
  "5",
  "1",
  "2",
  "4"
];

var arrayTwo = [{
  "page_id": "5",
  "page_title": "About"
}, {
  "page_id": "2",
  "page_title": "Home"
}, {
  "page_id": "4",
  "page_title": "Contact Us"
}, {
  "page_id": "1",
  "page_title": "Gallery"
}];

arrayTwo = arrayOne.map(function(id) {
  return arrayTwo.filter(function(obj) {
    return obj.page_id === id
  })[0]
});

console.log(arrayTwo);

答案 2 :(得分:0)

首先创建一个“索引”,给定一个对象编号可以返回数字:

<table class="col-xs-12">

然后您可以使用索引对对象重新排序:

var index = {};
arrayTwo.forEach(function(obj){index[obj.page_id] = obj;});

答案 3 :(得分:0)

您还可以使用2 forEach(每个阵列一个)

var arrayOne = [
    "5",
    "1",
    "2",
    "4"
]
var arrayTwo = [
    {
        "page_id" : "5",
        "page_title" : "About"
    },
    {
        "page_id" : "2",
        "page_title" : "Home"
    },
    {
        "page_id" : "4",
        "page_title" : "Contact Us"
    },
    {
        "page_id" : "1",
        "page_title" : "Gallery"
    },
];

var result = [];
arrayOne.forEach(item => arrayTwo.forEach(element => { if (item === element.page_id) result.push(element)}));

console.log(result);

答案 4 :(得分:0)

我认为使用find会更具可读性。

arrayOne.map(id => arrayTwo.find(row => row.page_id === id));

如果您需要支持更多浏览器,则可以改为使用sort

arrayTwo.sort((a, b) => arrayOne.indexOf(a.page_id) - arrayOne.indexOf(b.page_id));