JS Map 和 List 的简单实现代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS Map 和 List 的简单实现代码相关的知识,希望对你有一定的参考价值。

参考技术A 本篇文章是对在JS中Map和List的简单实现代码进行了详细的分析介绍 需要的朋友参考下   复制代码 代码如下: /*  * MAP对象 实现MAP功能  *  * 接口  * size()     获取MAP元素个数  * isEmpty()    判断MAP是否为空  * clear()     删除MAP所有元素  * put(key value)   向MAP中增加元素(key value)  * remove(key)    删除指定KEY的元素 成功返回True 失败返回False  * get(key)    获取指定KEY的元素值VALUE 失败返回NULL  * element(index)   获取指定索引的元素(使用element key element value获取KEY和VALUE) 失败返回NULL  * containsKey(key)  判断MAP中是否含有指定KEY的元素  * containsValue(value) 判断MAP中是否含有指定VALUE的元素  * values()    获取MAP中所有VALUE的数组(ARRAY)  * keys()     获取MAP中所有KEY的数组(ARRAY)  *  * 例子  * var map = new Map();  *  * map put("key" "value");  * var val = map get("key")  * ……  *  */ function Map()     this elements = new Array();     //获取MAP元素个数     this size = function()         return this elements length;     ;     //判断MAP是否为空     this isEmpty = function()         return (this elements length < );     ;     //删除MAP所有元素     this clear = function()         this elements = new Array();     ;     //向MAP中增加元素(key value)     this put = function(_key _value)         this elements push(             key : _key             value : _value         );     ;     //删除指定KEY的元素 成功返回True 失败返回False     this remove = function(_key)         var bln = false;         try             for (i = ; i < this elements length; i++)                 if (this elements[i] key == _key)                     this elements splice(i );                     return true;                                     catch (e)             bln = false;                 return bln;     ;     //获取指定KEY的元素值VALUE 失败返回NULL     this get = function(_key)         try             for (i = ; i < this elements length; i++)                 if (this elements[i] key == _key)                     return this elements[i] value;                                     catch (e)             return null;             ;     //获取指定索引的元素(使用element key element value获取KEY和VALUE) 失败返回NULL     this element = function(_index)         if (_index < || _index >= this elements length)             return null;                 return this elements[_index];     ;     //判断MAP中是否含有指定KEY的元素     this containsKey = function(_key)         var bln = false;         try             for (i = ; i < this elements length; i++)                 if (this elements[i] key == _key)                     bln = true;                                     catch (e)             bln = false;                 return bln;     ;     //判断MAP中是否含有指定VALUE的元素     this containsValue = function(_value)         var bln = false;         try             for (i = ; i < this elements length; i++)                 if (this elements[i] value == _value)                     bln = true;                                     catch (e)             bln = false;                 return bln;     ;     //获取MAP中所有VALUE的数组(ARRAY)     this values = function()         var arr = new Array();         for (i = ; i < this elements length; i++)             arr push(this elements[i] value);                 return arr;     ;     //获取MAP中所有KEY的数组(ARRAY)     this keys = function()         var arr = new Array();         for (i = ; i < this elements length; i++)             arr push(this elements[i] key);                 return arr;     ; 复制代码 代码如下: /**  * js实现list  *  */ function List()     this value = [];     /* 添加 */     this add = function(obj)         return this value push(obj);     ;     /* 大小 */     this size = function()         return this value length;     ;     /* 返回指定索引的值 */     this get = function(index)         return this value[index];     ;     /* 删除指定索引的值 */     this remove = function(index)         this value splice(index );         return this value;     ;     /* 删除全部值 */     this removeAll = function()         return this value = [];     ;     /* 是否包含某个对象 */     this constains = function(obj)         for ( var i in this value)             if (obj == this value[i])                 return true;             else                 continue;                             return false;     ;     /* 是否包含某个对象 */     this getAll = function()         var allInfos = ;         for ( var i in this value)             if(i != (value length ))                 allInfos += this value[i]+" ";             else                 allInfos += this value[i];                             alert(allInfos);         return allInfos += this value[i]+" ";;     ; lishixinzhi/Article/program/Java/JSP/201311/20400

List/Map 导出到表格(使用注解和反射)

Java 的 POI 库可以用来创建和操作 Excel 表格,有时候我们只需要简单地将 List 或 Map 导出到表格,样板代码比较多,不够优雅。如果能像 Gson 那样,使用注解标记要导出的属性,就方便的多。

Github:https://github.com/imcloudfloating/ListToExcell

POI 的依赖:

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>4.1.0</version>
</dependency>

1. 创建注解

package cloud.list2excel.annotation;

import org.apache.poi.hssf.util.HSSFColor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column
    String title() default "";
    short fontSize() default 14;
    HSSFColor.HSSFColorPredefined fontColor() default HSSFColor.HSSFColorPredefined.BLACK;
    HSSFColor.HSSFColorPredefined borderColor() default HSSFColor.HSSFColorPredefined.BLACK;

创建一个 @Column 注解,用于标记字段

  • title:该字段在表格头部的名称,默认值为属性名。
  • fontSize:字体大小,默认 14px。
  • fontColor:字体颜色,默认黑色。
  • borderColor:边框颜色,默认黑色。

2. 使用反射获取注解,用 POI 将数据写入到表格

这部分用的 Kotlin,但是反射和注解还是用的 Java,因为 Kotlin 反射获取的字段是排过序的,不是声明的顺序。

package cloud.list2excel.util

import cloud.list2excel.annotation.Column
import org.apache.poi.hssf.usermodel.HSSFCellStyle
import org.apache.poi.hssf.usermodel.HSSFSheet
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.BorderStyle

/**
 * List/Map 导出 Excel 表格
 * @author Cloud
 */
object ListToExcel 

    private var workbook: HSSFWorkbook = HSSFWorkbook()
    private val cellStyles: MutableList<HSSFCellStyle> = ArrayList()

    /**
     * 处理单个 Sheet
     */
    fun from(data: List<Any>): HSSFWorkbook 
        toWorkbook("Sheet0", data)
        return workbook
    

    /**
     * 处理多个 Sheet
     */
    fun from(data: Map<String, List<Any>>): HSSFWorkbook 
        if (data.isEmpty())
            return workbook

        for (sheet in data) 
            toWorkbook(sheet.key, sheet.value)
        

        return workbook
    

    private fun toWorkbook(sheetName: String, list: List<Any>) 
        val sheet = workbook.createSheet(sheetName)

        if (list.isEmpty())
            return

        val headers: MutableList<String> = ArrayList()
        val data: MutableList<MutableList<Any>> = ArrayList()

        // 获取注解并设置表头
        for (field in list[0].javaClass.declaredFields) 
            field.isAccessible = true

            val annotation = field.getAnnotation(Column::class.java)

            if (annotation != null) 
                headers.add(if (annotation.title == "") field.name else annotation.title)

                val cellStyle = workbook.createCellStyle().also  style ->
                    style.setFont(workbook.createFont().also 
                        it.fontHeightInPoints = annotation.fontSize
                        it.color = annotation.fontColor.index
                    )

                

                cellStyle.run 
                    leftBorderColor = annotation.borderColor.index
                    topBorderColor = annotation.borderColor.index
                    rightBorderColor = annotation.borderColor.index
                    bottomBorderColor = annotation.borderColor.index

                    borderLeft = BorderStyle.THIN
                    borderTop = BorderStyle.THIN
                    borderRight = BorderStyle.THIN
                    borderBottom = BorderStyle.THIN
                

                cellStyles.add(cellStyle)
            
        

        // 获取数据
        for (obj in list) 
            val rowData: MutableList<Any> = ArrayList()
            for (field in obj.javaClass.declaredFields) 
                field.isAccessible = true

                val annotation = field.getAnnotation(Column::class.java)

                if (annotation != null) 
                    val t = field.get(obj)
                    if (t == null) 
                        rowData.add("")
                     else 
                        rowData.add(t)
                    
                
            
            data.add(rowData)
        

        setHeader(sheet, headers)
        setData(sheet, data)
    

    /**
     * 设置表格头
     */
    private fun setHeader(sheet: HSSFSheet, headers: List<String>) 
        val row = sheet.createRow(0)

        for (i in headers.indices) 
            val cell = row.createCell(i)
            cell.setCellValue(headers[i])
            cell.setCellStyle(cellStyles[i])
        
    

    /**
     * 写入数据
     */
    private fun setData(sheet: HSSFSheet, data: List<List<Any>>) 
        for (i in data.indices) 
            val row = sheet.createRow(i + 1)

            for (j in data[i].indices) 
                val cell = row.createCell(j)
                cell.setCellValue(data[i][j].toString())
                cell.setCellStyle(cellStyles[j])
                sheet.autoSizeColumn(j)
            
        
    

from() 的参数为 List 时,直接写入 workbook 然后返回,为 Map 时,将 Map 中的 List 逐个写入到 workbook,Map 的 key 作为 Sheet 的名称。

3. 使用

创建两个实体类测试:

package cloud.list2excel.util

import cloud.list2excel.annotation.Column
import org.apache.poi.hssf.util.HSSFColor
import java.sql.Date

data class Film(
    @Column(title = "ID", fontColor = HSSFColor.HSSFColorPredefined.RED)
    var id: Int? = null,

    @Column(title = "Title")
    var title: String? = null,

    @Column(title = "Release Date")
    var release_date: Date? = null,

    @Column(title = "Duration")
    var duration: String? = null
)
package cloud.list2excel.util

import cloud.list2excel.annotation.Column
import java.sql.Date

data class Actor(
    @Column(title = "ID")
    var id: Int? = null,

    @Column(title = "Full Name")
    var name: String? = null,

    @Column(title = "Birth")
    var birth: Date?=null
)

测试类:

此处写入了两个 Sheet。

package cloud.list2excel.util

import java.io.File
import java.sql.Date

class ListToExcelTest 

    private val films = listOf(
        Film(1, "Iron Man", Date.valueOf("2008-4-30"), "126 min"),
        Film(2, "Star Wars: Episode IV - A New Hope", Date.valueOf("1977-5-25"), "121 min"),
        Film(3, "Zootropolis", Date.valueOf("2016-3-4"), "109 min")
    )

    private val actors = listOf(
        Actor(1, "Robert John Downey Jr.", Date.valueOf("1965-4-4")),
        Actor(2, "Mark Hamill", Date.valueOf("1951-9-25")),
        Actor(3, "Ginnifer Goodwin", Date.valueOf("1978-5-22"))
    )

    private val data = mapOf(
        Pair("films", films),
        Pair("actors", actors)
    )

    @org.junit.Test
    fun toExcel() 
        val before = System.currentTimeMillis()
        val workbook = ListToExcel.from(data)
        val after = System.currentTimeMillis()
        println("Time Usage: $after - beforems")
        workbook.write(File("/home/data.xls"))
    

导出结果:

技术图片

技术图片

效率似乎不怎么高 ^_^

以上是关于JS Map 和 List 的简单实现代码的主要内容,如果未能解决你的问题,请参考以下文章

用List来实现一个简单的Map(包含key, 和Value),这个简单Map需要提供(add, get, remove)的基本功能。

js实现简单的图片轮播

Java中集合框架,Collection接口Set接口List接口Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

关于js中 .map()的问题,希望大神可以帮忙解读下这段代码的实现过程

Python 之内置函数:filter、map、reduce、zip、enumerate

vue.js几行实现的简单的todo list