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

时间:2016-01-28 15:49:37

标签: javascript arrays reactjs lodash

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

server<-shinyServer(
  function(input, output) {
    weight1 <- 0.7 
    weight2 <- 1 - weight1

    asset1 <- reactive({ input$sum * weight1 })
    asset2 <- reactive({ input$sum * weight2 })

    output$result <- renderText({
      for (j in 1:input$counter1) {
        start <- input$sum
        for (i in 1:input$counter2) {
          start <- asset1() * asset2() * rnorm(1, mean=0, sd=1)
          value1 <- start
        }
        result1 <- quantile(value1, c(0.01))
        outputresult1 <- value1
      }
      paste("Results:", outputresult1)
    })
  }
)

library(shiny)
ui <- shinyUI(
  fluidPage(
    titlePanel(title = "Simulation"),
    sidebarLayout(
      sidebarPanel(
        "Data",
        numericInput("sum", "sum:", 0, min=0, max=1000000),
        numericInput("counter1", "counter1:", 0, min=0, max=1000),
        numericInput("counter2", "counter2:", 0, min=0, max=1000)
      ),
      mainPanel(
        textOutput("result")
      )
    )
  )
)

shinyApp(ui,server)

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

    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 },
    ];

第一个元素应该是搜索键值对。我正在使用lodash,我尝试了

 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 },
    ];

任何人都可以帮助我完成它吗?提前谢谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

普通Javascript中的解决方案。

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

    或直接排序

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

答案 2 :(得分:1)

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的函数。在这种情况下,我们将它分成数组&#34;对象,这些对象是&#39; fred3&#39;&#34;和&#34;不是&#39; fred3&#39;&#34;的对象。然后我们只需要将这两个数组与#34;对象连接在一起,这些对象是&#39; fred3&#39;&#34;在前面。

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