搜索键值对匹配和排序数组



我是Javascript的初学者,在从该数组中找到键值后,我正在尝试对数组进行排序,例如:

    var users = [
        { 'user': 'fred', 'age': 48 },
        { 'user': 'barney', 'age': 49},
        { 'user': 'fred1', 'age': 50 },
        { 'user': 'barney1', 'age': 51 },
        { 'user': 'barney2', 'age': 55 },
        { 'user': 'fred2', 'age': 56 },
        { 'user': 'barney3', 'age': 57 },
        { 'user': 'fred3', 'age': 58 },
        { 'user': 'barney4', 'age': 59 },
        { 'user': 'fred4', 'age': 60 },
    ];

在这个数组中,首先我想找到值为 fred3 的用户,然后通过将 fred3 作为第一个元素来重新排列数组,如下所示

 var users = [
        { 'user': 'fred3', 'age': 58 },
        { 'user': 'fred', 'age': 48 },
        { 'user': 'barney', 'age': 49},
        { 'user': 'fred1', 'age': 50 },
        { 'user': 'barney1', 'age': 51 },
        { 'user': 'barney2', 'age': 55 },
        { 'user': 'fred2', 'age': 56 },
        { 'user': 'barney3', 'age': 57 },
        { 'user': 'barney4', 'age': 59 },
        { 'user': 'fred4', 'age': 60 },
    ];

第一个元素应该是搜索键值对。我为此使用 lodash,我尝试过像

_.map(users, item =>{
    let searchedItem = this.isThisItem(item) ? item : null;
     // This searchedItem may be null also
    let Other = return _.reject(users, item=>{
       return searchedItem.value === item.value;
    })
            //here i want to do sort
}),
isThisItem(item){
   // Logic here to match item with other data, if it exist it returns true.                   
}

谁能帮我完成它?提前谢谢。

您可以使用

array.filter删除搜索的对象。然后您可以使用自定义排序函数进行排序,然后使用 unshift ,您可以将值附加到数组中。

var users = [
        { 'user': 'fred', 'age': 48 },
        { 'user': 'barney', 'age': 49},
        { 'user': 'fred1', 'age': 50 },
        { 'user': 'barney1', 'age': 51 },
        { 'user': 'barney2', 'age': 55 },
        { 'user': 'fred2', 'age': 56 },
        { 'user': 'barney3', 'age': 57 },
        { 'user': 'fred3', 'age': 58 },
        { 'user': 'barney4', 'age': 59 },
        { 'user': 'fred4', 'age': 60 },
    ];
  
  var searchName = "fred3"
  var searchedObj = users.filter(function(item){
    return item.user === searchName;
  })[0];
  
  var result = users.filter(function(item){
    return (item.user !== searchName);
  }).sort(function(a,b){
    return a.age - b.age;
  });
  
  result.unshift(searchedObj);
  
  console.log(result)

一个普通 Javascript 中的解决方案。

  1. 搜索给定用户并
  2. 在索引处拼接数组并将其插入数组的开头。

var users = [{ 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 49 }, { 'user': 'fred1', 'age': 50 }, { 'user': 'barney1', 'age': 51 }, { 'user': 'barney2', 'age': 55 }, { 'user': 'fred2', 'age': 56 }, { 'user': 'barney3', 'age': 57 }, { 'user': 'fred3', 'age': 58 }, { 'user': 'barney4', 'age': 59 }, { 'user': 'fred4', 'age': 60 }, ];
function moveToTop(user, users) {
    users.some(function (a, i) {
        if (a.user === user) {
            users.unshift(users.splice(i, 1)[0]);
            return true;
        }
    });
}
moveToTop('fred3', users);
document.write('<pre>' + JSON.stringify(users, 0, 4) + '</pre>');

或直接进行分拣

var users = [{ 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 49 }, { 'user': 'fred1', 'age': 50 }, { 'user': 'barney1', 'age': 51 }, { 'user': 'barney2', 'age': 55 }, { 'user': 'fred2', 'age': 56 }, { 'user': 'barney3', 'age': 57 }, { 'user': 'fred3', 'age': 58 }, { 'user': 'barney4', 'age': 59 }, { 'user': 'fred4', 'age': 60 }, ],
    user = 'fred3';
users.sort(function (a, b) {
    return (a.user === user || a.age) - (b.user === user || b.age);
});
document.write('<pre>' + JSON.stringify(users, 0, 4) + '</pre>');

map在这里不是正确的工具。 作为第二个参数传递的函数将按顺序在数组的每个元素上执行,并且不能用于对数组重新排序。 如果要将一个事物的集合转换为另一个事物的集合,那就更好了。 例如,假设您要将对象集合更改为仅包含每个对象的用户名的集合 - map这就是您想要的。

已经发布的其他解决方案应该运行良好;但是如果你真的想使用 lodash,你可以做这样的事情:

var users = [
    { 'user': 'fred', 'age': 48 },
    { 'user': 'barney', 'age': 49},
    { 'user': 'fred1', 'age': 50 },
    { 'user': 'barney1', 'age': 51 },
    { 'user': 'barney2', 'age': 55 },
    { 'user': 'fred2', 'age': 56 },
    { 'user': 'barney3', 'age': 57 },
    { 'user': 'fred3', 'age': 58 },
    { 'user': 'barney4', 'age': 59 },
    { 'user': 'fred4', 'age': 60 }
];
var split = _.partition(users, {'user': 'fred3'});
console.log(split);
var result = split[0].concat(split[1]);
console.log(result);

(这是JSBin上的上述内容)

partition 获取一个数组并根据谓词将其拆分为两个数组 - 一个接受一个参数并返回 true 或 false 的函数。 在这种情况下,我们将其拆分为数组"对象是'fred3'"和"不是'fred3'的对象"。 然后我们只需获取这两个数组,并将它们与前面的"'fred3'对象"连接在一起。

partition的第二个论点非常灵活;我在这里使用了 lodash 文档中的速记,但您可以传递一个常规谓词函数(如您的 isThisItem(item) { ... })。

最新更新