我是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 },
];
任何人都可以帮助我完成它吗?提前谢谢。
答案 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中的解决方案。
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) { ... }
)。