根据其中一个属性对对象数组进行排序

时间:2015-04-12 02:56:14

标签: javascript arrays sorting object

我不知道这是不是特殊情况,但问题非常简单。 让我们假设您有一个数组,它定义了对象必须排序的顺序。让我们说这个数组就像这个:

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);

我在这个剧本中做错了什么?或者你能想出更好的解决方法吗?

谢谢。

4 个答案:

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