我有一个特定顺序的字符串数组,并希望安排不同的对象数组以匹配原始数组顺序。
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"
}
];
有什么好的方法可以解决这个问题吗?
干杯,
答案 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"
出现问题)。