用JavaScript压缩二维数组的重复

时间:2018-08-24 16:15:31

标签: javascript arrays multidimensional-array

library(shiny)


setUnitUI <- function(id) {
  ns <- NS(id)
  selectInput(ns('unit'), 'unit', c('km', 'mile'))
}

setValueUI <- function(id) {
  ns <- NS(id)
  uiOutput(ns('dynamicSlider'))
}

showValueUI <- function(id) {
  ns <- NS(id)
  textOutput(ns('value'))
}

ui <- fluidPage(
  setUnitUI('unit'),
  setValueUI('value'),
  showValueUI('show')
)


setUnitModule <- function(input, output, session) {
  reactive(input$unit)
}

setValueModule <- function(input, output, session, unitGetter) {
  output$dynamicSlider <- renderUI({
    ns <- session$ns
    unit <- unitGetter()
    if (unit == 'km') {
      sliderInput(ns('pickValue'), paste('Pick value in', unit), 
                  min=0, max=150, value=0)
    } else {
      sliderInput(ns('pickValue'), paste('Pick value in', unit), 
                  min=0, max=100, value=0)
    }
  })

  reactive(input$pickValue)
}

showValueModule <- function(input, output, session, unitGetter, valueGetter) {
  output$value <- renderText(paste('You chose', valueGetter(), unitGetter()))
}

server <- function(input, output, session) {
  unitGetter <- callModule(setUnitModule, 'unit')
  valueGetter <- callModule(setValueModule, 'value', unitGetter)
  callModule(showValueModule, 'show', unitGetter, valueGetter)
}


shinyApp(ui, server, options=list(launch.browser=TRUE))

上面是具有大量数据重复的二维数组,该数组需要通过以下规定进行简化:

  • 索引数据0,必须为完整数据(无变化)
  • 索引0之后的数据,如果该值与先前的索引相同,则将其更改为”
  • 结果数据必须保留为二维数组形式

因此结果将如下所示

  • 索引数据0,必须为完整数据(无变化)
  • 索引0之后的数据,如果该值与先前的索引相同,则将其更改为”
  • 结果数据必须保留为二维数组形式

所以结果将显示如下:

var mycars = [['Ford', 'Fiesta', 'Manual', 'Rp. 160.000.000'],
            ['Ford', 'Fiesta', 'Manual', 'Rp. 163.000.000'],
            ['Ford', 'Fiesta', 'Automatic', 'Rp. 170.000.000'],
            ['Ford', 'Fiesta', 'Automatic', 'Rp. 175.000.000'],
            ['Ford', 'Fiesta', 'Automatic', 'Rp. 173.000.000'],
            ['Ford', 'Focus', 'Manual', 'Rp. 350.000.000'],
            ['Ford', 'Focus', 'Automatic', 'Rp. 400.000.000'],
            ['VW', 'Golf', 'Manual', 'Rp. 360.000.000'],
            ['VW', 'Golf', 'Manual', 'Rp. 365.000.000'],
            ['VW', 'Golf', 'Automatic', 'Rp. 390.000.000']];

上面的结果可以像开头一样再次解压缩。

2 个答案:

答案 0 :(得分:0)

您可以采用一个临时数组,并在同一索引处对照tmeporary数组的值检查该值,如果相同则采用空字符串'',或通过将该值存储到临时数组来获得该值

要进行解压缩,可以对临时数组进行分配,然后检查实际值是否为truthy,然后采用该值或采用临时数组的值。返回该值。

var data = [['Ford', 'Fiesta', 'Manual', 'Rp. 160.000.000'], ['Ford', 'Fiesta', 'Manual', 'Rp. 163.000.000'], ['Ford', 'Fiesta', 'Automatic', 'Rp. 170.000.000'], ['Ford', 'Fiesta', 'Automatic', 'Rp. 175.000.000'], ['Ford', 'Fiesta', 'Automatic', 'Rp. 173.000.000'], ['Ford', 'Focus', 'Manual', 'Rp. 350.000.000'], ['Ford', 'Focus', 'Automatic', 'Rp. 400.000.000'], ['VW', 'Golf', 'Manual', 'Rp. 360.000.000'], ['VW', 'Golf', 'Manual', 'Rp. 365.000.000'], ['VW', 'Golf', 'Automatic', 'Rp. 390.000.000']],
    compressed = data.map((t => a => a.map((v, i) => v === t[i]
        ? ''
        : t[i] = v
    ))([])),
    decompressed =data.map((t => a => a.map((v, i) => t[i] = v || t[i]))([]));

console.log(compressed);
console.log(decompressed);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

这是一个数据结构问题。

您将需要2个for循环。 逻辑很简单,将使用另外两个数组一个2D和一个1D:

  1. 将arr1的第一行分配给arr2。
  2. 离开第一行并使用arr1 i=1的第二个开始循环。
  3. 将arr3设置为空数组。
  4. 为内部数组j=0启动另一个循环。
  5. 检查是否arr1[i][j] === arr[i-1][j] ,然后将“”推到arr3.push(''),如果,则将arr1[i][j]推到{{1} }。
  6. 完成第二个循环。
  7. arr3.push(arr1[i][j])分配给arr3
  8. 完成外循环。

这是工作逻辑

`

arr2.push(arr3)

`