我不知道这是不是特殊情况,但问题非常简单。 让我们假设您有一个数组,它定义了对象必须排序的顺序。让我们说这个数组就像这个:
var sort = [5, 1, 6];
此数组顺序是任意的(数字不是根据任何特定规则排序的),并且排序的对象数组必须遵循sort
数组中的项目出现的顺序)
你有一个对象数组,如下所示:
var obj = [{id: 1}, {id: 6}, {id:5}];
因此结果(根据sort
中的顺序和每个对象的id的值)应为:
obj = [{id: 5}, {id: 1}, {id:6}];
我尝试过这种方法:
var obj = [{id: 1}, {id: 6}, {id:5}];
var sort = [5, 1, 6];
var indexedObjArr = [],
tmpObj = {};
obj.forEach(function(item) {
tmpObj[item.id] = item;
indexedObjArr.push(tmpObj);
tmpObj = {};
});
obj = [];
//This is where it fails, obj ends up having all undefined entries
indexedObjArr.forEach(function(item, i) {
// [sort[i]] === undefined, but sort[i] gives an actual number (e.g. 5),
// and, for instance item[5], gives back the correct item
obj.push(item[sort[i]]);
});
console.log(obj);
我在这个剧本中做错了什么?或者你能想出更好的解决方法吗?
谢谢。
答案 0 :(得分:2)
为什么不直接使用内置的sort方法进行数组?
obj.sort(function(a, b) { return sort.indexOf(a.id) - sort.indexOf(b.id) });
var obj = [{id: 1}, {id: 6}, {id: 5}];
var sort = [5, 1, 6];
console.log(obj.sort(function(a, b) {
return sort.indexOf(a.id) - sort.indexOf(b.id)
}));
答案 1 :(得分:0)
代码中的缺陷:indexedObjArr看起来像[{1:id1item},{6:id6item},{5:id5item}]
显然,当你遍历这个数组时,item对象将是数组中的一个项目,例如{1:id1item}。现在,如果您尝试执行[sort [i]]项,即项目[5],这将显然是未定义的。
试试这个(只有更正......更新你的代码):
var indexedObj = {};//object not array
obj.forEach(function(item) {
indexedObj[item.id] = item;
});
//now the indexedObj will be { 1 : id1item, 6: id6item,...}
obj = [];
//run the loop in the order you want the sorting i.e. [5, 1, 6]
sort.forEach(function(id) {
obj.push(indexedObj[id]);//get the item for id as in the sort array
});
console.log(obj);
这种方法的另一个问题是假设排序数组与数组大小相同。如果情况并非如此,那么将需要特殊处理。 一个解决方案可能是:
sort.forEach(function(id) {
obj.push(indexedObj[id]);
//remove the processed id from indexedObj
delete indexedObj[id];
});
//now add all the objects left out.
for(var item in indexedObj) {
obj.push(indexedObj[item]);
}
答案 2 :(得分:0)
可以使用中间人从根源获取适当的项目,例如使用" findObj"这里。这可能是一种更优雅的方式来做到这一点,但是一种强大的力量"像这样的方法会让你到那里。
var obj = [{id: 1}, {id: 6}, {id:5}];
var sort = [5, 1, 6];
var result = [];
var findObj = function(id){
for (var i = 0; i < obj.length; i++){
if (obj[i].id === id){return obj[i];}
};
return null;
};
for (var pos = 0; pos < sort.length; pos++){
result.push(findObj(sort[pos]));
}
console.log(JSON.stringify(result));
我在这里创建了一个解决方案:http://jsfiddle.net/pp3qzowz/希望这会有所帮助。
答案 3 :(得分:0)
这是我的解决方案:)我希望它有所帮助!
var obj = [{id: 1}, {id: 6}, {id:5}];
var sort = [5, 1, 6];
var indexedObjArr = [],
sortedObj = [];
sort.forEach(function(item) {
obj.forEach(function(objItem){
if(objItem.id == item)
sortedObj.push(objItem);
});
});
console.log(sortedObj);