通过相应的字符串数组排列对象数组

时间:2015-03-19 07:48:34

标签: javascript

我有一个特定顺序的字符串数组,并希望安排不同的对象数组以匹配原始数组顺序。

var arrangement = ["third", "first" "second"];

var myObjs = [
  {
    name: "thing",
    position: "first"
  },
  {
    name: "thing",
    position: "second"
  },
  {
    name: "thing",
    position: "third"
  }
];

这样输出就是:

var myObjs = [
  {
    name: "thing",
    position: "third"
  },
  {
    name: "thing",
    position: "first"
  },
  {
    name: "thing",
    position: "second"
  }
];

有什么好的方法可以解决这个问题吗?

干杯,

3 个答案:

答案 0 :(得分:4)

对要排序的当前元素使用第一个数组的indexOf函数:

myObjs.sort(function(a, b) { 
    return arrangement.indexOf(a.position) - arrangement.indexOf(b.position);
})

答案 1 :(得分:2)

我将构建一个由第一个数组中的position值键入的映射(一个对象),每个条目的索引作为值; e.g:

var map = arrangement.reduce(function(obj, value, index) {
    obj[value] = index;
    return obj;
}, {});

然后我在Array#sort上使用myObjs和一个比较器函数,该函数查找position上给出的两个条目的map值:

myObjs.sort(function(a, b) {
    return map[a.position] - map[b.position];
});

实例:

var arrangement = ["third", "first", "second"];

var myObjs = [
        {
            name: "thing",
            position: "first"
        },
        {
            name: "thing",
            position: "second"
        },
        {
            name: "thing",
            position: "third"
        }
    ];

var map = arrangement.reduce(function(obj, value, index) {
    obj[value] = index;
    return obj;
}, {});

myObjs.sort(function(a, b) {
    return map[a.position] - map[b.position];
});

snippet.log("Result: " + JSON.stringify(myObjs));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 2 :(得分:1)

首先,您需要“索引”对象数组:

var objpos = {};
objects.forEach(function(obj, ix) { objpos['!' + obj.name] = ix; });

然后你可以建立结果

var result = arrangement.map(function(name) {
    return objects[objpos['!' + n]];
});

!是我习惯在将对象用作词典时将其添加到键前(以避免键"constructor"出现问题)。