我有一个或多个对象数组,每个对象都有两个属性,其中一个是数组。所以看起来像这样:
[
[{
name: 'Object1',
items: ['item1', 'item2', 'item3']
}],
[{
name: 'Object2',
items: ['item4', 'item5', 'item6']
}],
[{
name: 'Object3',
items: ['item7', 'item8', 'item9']
}]
]
我要做的是将所有项目都存储到Object 1
中。所以基本上,这就是我想要的样子:
[
{
name: 'Object1',
items: ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9']
}
]
我想我可以创建一个新对象并映射每个项目,然后将它们连接起来,但是我正在寻找一种更有效的方法。完成这项工作的最佳方法是什么?
答案 0 :(得分:2)
您可以使用Array.flatMap()
和destructuring来获取单个数组中的所有项目。然后将数组分配给items
属性。
注意:IE和Edge不支持Array.flatMap()
。
const arr = [[{"name":"Object1","items":["item1","item2","item3"]}],[{"name":"Object2","items":["item4","item5","item6"]}],[{"name":"Object3","items":["item7","item8","item9"]}]];
const result = [{
name: 'Object1',
items: arr.flatMap(([o]) => o.items)
}];
console.log(result);
答案 1 :(得分:1)
通过es5,您可以将Array.prototype.reduce() 与Array.prototype.concat()结合使用,如下所示:
const newArray = oldArray.reduce((list, current) => list.concat(current[0].items), [])
实时示例代码:
const arr = [
[{
name: 'Object1',
items: ['item1', 'item2', 'item3']
}],
[{
name: 'Object2',
items: ['item4', 'item5', 'item6']
}],
[{
name: 'Object3',
items: ['item7', 'item8', 'item9']
}]
]
const y = arr.reduce((list, current) => list.concat(current[0].items), [])
console.log(y)
答案 2 :(得分:0)
您可以使用价差运算符来做到这一点。
$minimum-cell-width
... item [0]。如果内部对象不应该包装在数组中,则应将item更改为item.items。
答案 3 :(得分:0)
使用类似此代码的map()函数
library(shiny)
library(dplyr)
# global data-frame
df <<- data.frame(id = letters[1:10], decision = 0)
update_decision_value <- function (id, dec) {
df[df$id == id, "decision"] <<- dec
}
ui <- fluidPage(
uiOutput('select_id'),
uiOutput('decision_value'),
dataTableOutput('my_table')
)
server <- function(input, output, session) {
filter.data <- reactive({
df %>%
filter(decision == 0)
})
output$select_id <- renderUI({
selectInput('selected_id', "ID:", choices = df$id)
})
output$decision_value <- renderUI({
radioButtons(
'decision_value',
"Decision Value:",
choices = c("Display" = 0, "Hide" = 1),
selected = df[df$id == input$selected_id, "decision"]
)
})
output$my_table <- renderDataTable({
filter.data()
})
observeEvent(input$decision_value, {
update_decision_value(input$selected_id, input$decision_value)
})
}
shinyApp(ui, server)
答案 4 :(得分:0)
从编写仅合并两个对象的逻辑开始。这是您明确地说出的地方:
“我们使用看到的第一个
LEN(...)>1
,并连接name
”
items
仍然存在两个挑战:
const mergeObjects = (obj1, obj2) => ({
name: obj1.name || obj2.name,
items: obj1.items.concat(obj2.items)
});
console.log(
mergeObjects(
{ name: 'Object1', items: ['item1', 'item2', 'item3'] },
{ name: 'Object2', items: ['item4', 'item5', 'item6'] }
)
);
第一个问题可以通过使用帮助程序来解决,该帮助程序将对象从其数组中取出,合并它们,然后将它们包装回数组中。
[ { /* .... */ } ]
第二个是使用reduce的问题!
const mergeNestedObjects = ([obj1], [obj2]) => [mergeObjects(obj1, obj2)];
还有一个陷阱:此操作只能用于长度为const mergeObjects = (obj1, obj2) => ({
name: obj1.name || obj2.name,
items: obj1.items.concat(obj2.items)
});
const mergeNestedObjects = ([obj1], [obj2]) => [mergeObjects(obj1, obj2)];
const data=[[{name:"Object1",items:["item1","item2","item3"]}],[{name:"Object2",items:["item4","item5","item6"]}],[{name:"Object3",items:["item7","item8","item9"]}]];
console.log(
data.reduce(mergeNestedObjects)
)
的数组;我们至少需要两项才能执行合并。
为解决此问题,我们可以创建一个“种子”值。一个空项目:
>= 2