[ Javascript 面试题 ]:提取对应的信息,并给其赋予一个颜色,保持幂等性

题目

有一不定长的数组,里面存有的元素是字符串的形式,每个字符串包含运营商与 IP 地址的信息(用 -分隔)。

我们希望每个运营商都有一个对应的颜色,即使每次重新运行,传入不同的数组,该颜色对应都不改变。

实现幂等性:相同的输入字符串总是产生相同的输出颜色。

输入

js 复制代码
let arr = [
    "电信-111.123.321.22",
    "移动-121.111.321.11",
    "联通-123.123.321.33",
    "ABC-133.123.321.44",
    "ABC-144.123.321.55",
];

输出

bash 复制代码
[
  {value:"电信-111.123.321.22",src:"电信",ip:"111.123.321.22",color:"#e5cfc5"},
  {value:"移动-121.111.321.11",src:"移动",ip:"121.111.321.11",color:"#99f5d8"},
  {value:"联通-123.123.321.33",src:"联通",ip:"123.123.321.33",color:"#aeefae"},
  {value:"ABC-133.123.321.44",src:"ABC",ip:"133.123.321.44",color:"#da838b"},
  {value:"ABC-144.123.321.55",src:"ABC",ip:"144.123.321.55",color:"#da838b"},
]

思路

  1. 先处理最简单的部分,将 ip 和 运营商 分割(使用 "".split() 函数)。

  2. 一开始我想着用 Map 来存储运营商与颜色的映射,但这样只要重新传入不同数组,颜色的对应就会改变,无法保证幂等性。

    js 复制代码
    let arr = [
      "电信-111.123.321.22",
      "移动-121.111.321.11",
      "联通-123.123.321.33",
      "ABC-133.123.321.44",
      "ABC-144.123.321.55",
    ];
    ​
    let map = new Map();
    ​
    // 此处逐个生成新颜色,简要编写非最终效果
    let color = 0;
    function colorGen() {
      color += 10;
      return "#"+color;
    }
    ​
    let ans = arr.map((value) => {
      let [key, ip] = value.split("-");
      let color = map.get(key);
    ​
      if (!color) {
        color = colorGen();
        map.set(key, color);
      }
    ​
      return {
        value,
        src: key,
        ip,
        color,
      };
    });
    ​
    console.log(ans);
  3. 正确的实现方法是哈希,获取一个值将其映射为颜色

    js 复制代码
    let arr = [
      "电信-111.123.321.22",
      "移动-121.111.321.11",
      "联通-123.123.321.33",
      "ABC-133.123.321.44",
      "ABC-144.123.321.55",
    ];
    
    // 经典DJB2哈希算法变种,生成一个哈希值
    function hash(str) {
      let hashValue = 5381; // 初始质数(常用哈希种子)
      for (let i = 0; i < str.length; i++)
        hashValue = (hashValue << 5) + hashValue + str.charCodeAt(i);
      return hashValue;
    }
    
    // 将哈希值映射为颜色,颜色的 RGB 每一个位置都有两个十六进制数
    function colorGen(key) {
      let hashValue = hash(key);
    
      let color = "#";
    
      for (let i = 0; i < 3; i++) {
        const value = (hashValue >> (i * 8)) & 0xff;   // 移位后取最右边 8 位
        const adjust = 0x80 + (value % 0x80);          // 限制在 128 到 255,避免过暗
        color += adjust.toString(16).padStart(2, '0'); // 避免数字不够两位
      }
    
      return color;
    }
    
    let ans = arr.map((value) => {
      let [key, ip] = value.split("-");
    
      return {
        value,
        src: key,
        ip,
        color: colorGen(key),
      };
    });
    
    console.log(ans);
相关推荐
乱码三千15 分钟前
使用ComfyUI+MinMax-H3音视频模型生成视频
前端·后端·github
Coder_Ke17 分钟前
代码我都定位了,Codex 还在考古:于是我写了个 VS Code 插件
前端
LiaCode1 小时前
别让 AI 把仓库写成“代码平行宇宙”:从 Deslop 看生成前查重
前端·后端·github
nice先生的狂想曲2 小时前
javascript高级程序设计(六)——2026.9.5
前端·javascript
我爱写代码i2 小时前
SKAPP SK影视反编译详细教程+源码 含苹果端ipa
开发语言·javascript·ecmascript
光影少年2 小时前
如何做大型React+RN 项目架构设计、目录规范
前端·react native·react.js
一位正在转型AI全栈的前端工程师2 小时前
AI 全栈学习之旅 -Week 8:从单 Agent 到多 Agent 协作:LangGraph 实战与记忆持久化
前端·python
用户921080262862 小时前
Promise 和 async/await:从用途到执行机制
前端
yyt3630458412 小时前
KLineChartQuant:GLSL 的精度问题及 RTC 解法
前端·vue.js·react.js·交互·图形渲染·webgl·数据可视化
HarmonLTS2 小时前
智盾 WAF v8.2 Ultra|下一代 Web 应用防火墙
前端