将数组的项合并到单个对象中

时间:2018-10-23 20:43:57

标签: javascript arrays

我有一个或多个对象数组,每个对象都有两个属性,其中一个是数组。所以看起来像这样:

[
 [{
   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']
 }
]

我想我可以创建一个新对象并映射每个项目,然后将它们连接起来,但是我正在寻找一种更有效的方法。完成这项工作的最佳方法是什么?

5 个答案:

答案 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将逻辑应用于列表

第二个是使用reduce的问题!

const mergeNestedObjects = ([obj1], [obj2]) => [mergeObjects(obj1, obj2)];

关于将种子值用于reduce的说明

还有一个陷阱:此操作只能用于长度为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