Sort an array of objects based on another key array

I have two arrays containing objects. One of them contains the keys in some order, and the other contains the data, and I need to sort the data array according to the given array of sorted keys. How can i do this?

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

The result should be:

result = [{d:4},{a:1},{b:2},{c:3]
+4
source share
5 answers

try it

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

b.sort(function(x,y){
  var xkey = a.indexOf(Object.keys(x)[0]);
  var ykey = a.indexOf(Object.keys(y)[0]);
  return xkey - ykey;
})

document.body.innerHTML += JSON.stringify(b,0,4);
Run codeHide result
+6
source

Another approach from the above options would be using the LodashJavascript Library.

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

var results = _.map(a,function(av) {
   var obj = {};
   obj[av] = _.find(b, av)[av];
   return obj
});

document.body.innerHTML += JSON.stringify(results);
<script src="https://cdn.jsdelivr.net/lodash/4.11.1/lodash.min.js"></script>
Run codeHide result
+4
source

- b .

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

var ans = [];

for(var i = 0; i < a.length; ++i)
{
 for(var j = 0; j < b.length; ++j)
 {
   if(b[j][a[i]])
     ans.push(b[j]);
 }
}
document.write(JSON.stringify(ans, 0, 4));
Hide result
0

result = a.map(function(key) {
    for(var i=0; i<b.length; ++i) {
        if(key in b[i]) return b[i];
    }
});
0

.

a.

d b, d

[ 1, 3, 0, 2 ]

e, b

[ 0, 1, 2, 3 ]

[ 2, 0, 3, 1 ]

. .

?

. Object.keys , , .

To do this, you need a different approach that is not used Array#indexOfin conjunction with a fixed element Object.keys.

var a = ['d', 'a', 'b', 'c'],
    b = [{ a: 1 }, { c: 3 }, { d: 4 }, { b: 2 }],
    d = b.map(function (bb) {
        var k = -1;
        a.some(function (aa, i) {
            if (aa in bb) {
                k = i;
                return true;
            }
        });
        return k;
    }),
    e = b.map(function (_, i) { return i; });

e.sort(function (a, b) {
    return d[a] - d[b];
});

b = e.map(function (a) {
    return b[a];
});

document.write('<pre> ' + JSON.stringify(b, 0, 4) + '</pre>');
Run codeHide result
0
source

All Articles