【问题标题】:Searching key value pair match and sort array搜索键值对匹配和排序数组
【发布时间】:2016-01-28 15:49:36
【问题描述】:

我是 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.                   
}

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

【问题讨论】:

  • 啊,排序结果的标准到底是什么?为什么首先是fred3,然后是fred,然后是barney,然后 fred1?它似乎不是按字母顺序排列的。
  • 应该只将想要的用户移到顶部,还是应该将结果按age排序并且想要的用户放在顶部?
  • 只是想要的用户应该移到顶部,剩余的不需要排序。

标签: javascript arrays reactjs lodash


【解决方案1】:

您可以使用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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      (Here是上面的JSBin)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        相关资源
        最近更新 更多