RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 970585
Accepted
pridan
pridan
Asked:2020-04-17 06:29:46 +0000 UTC2020-04-17 06:29:46 +0000 UTC 2020-04-17 06:29:46 +0000 UTC

点击时从数组中获取特定值

  • 772

有一个对象数组。在数组的基础上绘制一个表格在此处输入图像描述

任务是通过点击单元格来获取颜色段的第一个和最后一个id值。如果点击如图所示,那么应该得到“c9”和“d31”的值。对于任何其他段相同。我试图在单击时在数组中定义一个元素,并从它来回使用,直到下一个单元格的颜色与当前单元格的颜色不匹配。然后我们写下id。但是有些东西不出来。那行不通,然后永恒的循环开始了。也许 while 通常是一个坏主意。我将不胜感激

    let arr = [
        {
            id: 'm2c',
            color: 'yellow'
        },
        {
            id: 'd1b',
            color: 'red'
        },
        {
            id: 'd6',
            color: 'red'
        },
        {
            id: 'd3',
            color: 'red'
        },
        {
            id: 'd4',
            color: 'red'
        },
        {
            id: 'd5',
            color: 'yellow'
        },
        {
            id: 'd6',
            color: 'yellow'
        },
        {
            id: 'd7',
            color: 'yellow'
        },
        {
            id: 'v1',
            color: 'yellow'
        },
        {
            id: 'c9',
            color: 'red'
        },
        {
            id: 'd1k',
            color: 'red'
        }, {
            id: 'd92',
            color: 'red'
        },
        {
            id: 'd12',
            color: 'red'
        },
        {
            id: 'd31',
            color: 'red'
        },
        {
            id: 'd14',
            color: 'yellow'
        },
        {
            id: 'd12',
            color: 'yellow'
        },
        {
            id: 'd45',
            color: 'yellow'
        },
        {
            id: 'd3',
            color: 'yellow'
        },
{
            id: 'd00',
            color: 'yellow'
        },
{
            id: 'd3o',
            color: 'yellow'
        },
    ];


    let ul = document.createElement('ul');
    let startId = document.createElement('span');
        let endId = document.createElement('span');
    arr.forEach(function (item) {
        let li = document.createElement('li');
        li.style.backgroundColor = item.color;
        li.innerHTML = item.id;
        ul.appendChild(li);

    });
    document.getElementById('container').appendChild(ul);
        document.getElementById('container').appendChild(startId );
            document.getElementById('container').appendChild(ul);


    document.querySelector('ul').addEventListener('click', e => {
        let content = e.target.innerHTML;

        let startIdValue;
        let endIdValue;

        arr.forEach(function (item, i, arr) {

            if (item.id === content) {

                while (arr[i--]) {

                    if (arr[i - 1].color !== item.color) {
                        startIdValue = item.id;
                        return
                    }
                }

                while (arr[i++]) {

                    if (arr[i + 1].color !== item.color) {
                        endIdValue = item.id;
                        return
                    }
                }

            }
        });
    });
    
    
    
    ul {
        width: 1000px;
        padding-left: 0;
        margin-left: 0;
        display: flex;

    }

    li {
        width: 50px;
        height: 50px;
        list-style-type: none;
        border: 1px solid #ccc;
    }
<div id="container">

</div>

javascript
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. inweid
    2020-04-17T07:49:01Z2020-04-17T07:49:01Z

    尝试按照以下思路思考:

    document.querySelector('ul').addEventListener('click', e => {
    
        var content = e.target.innerHTML;
        var startIdValue;
        var endIdValue;
    
        // давай найдем для начала индекс элемента, на который ткнули
        var currentIndex = arr.findIndex(el => el.id === content);
    
        // затем найдем его цвет
        var currentColor = arr[currentIndex].color;
    
        // в цикле for началом отсчета зададим найденный индекс элемента
        // перебор будет осуществляться до тех пор, пока крайний цвет перестанет быть currentColor
        for (let i = currentIndex, arr[i].color == currentColor, i--) {
          // в конечном счете присвоится то, что нужно
          // здесь можешь выполнять какие-то дополнительные условия перед тем как присваивать, например найти цвет предыдущего айтема, если false - значит приехали - присваиваем
          startIdValue = arr[i].id
        }
    
        // аналогично здесь, только перебор по возрастанию
        for (let i = currentIndex, arr[i].color == currentColor, i++) {
          endIdValue = arr[i].id
        }
    });
    
    • 0
  2. yar85
    2020-04-17T17:15:47Z2020-04-17T17:15:47Z

    let arr = [
      { id: 'm2c', color: 'yellow' },
      { id: 'd1b', color: 'red' },
      { id: 'd6', color: 'red' },
      { id: 'd3', color: 'red' },
      { id: 'd4', color: 'red' },
      { id: 'd5', color: 'yellow' },
      { id: 'd6', color: 'yellow' },
      { id: 'd7', color: 'yellow' },
      { id: 'v1', color: 'yellow' },
      { id: 'c9', color: 'red' },
      { id: 'd1k', color: 'red' }, 
      { id: 'd92', color: 'red' },
      { id: 'd12', color: 'red' },
      { id: 'd31', color: 'red' },
      { id: 'd14', color: 'yellow' },
      { id: 'd12', color: 'yellow' },
      { id: 'd45', color: 'yellow' },
      { id: 'd3', color: 'yellow' },
      { id: 'd00', color: 'yellow' },
      { id: 'd3o', color: 'yellow' }
    ];
    
    const list = document.createElement('ul'); 
    list.innerHTML = arr.map(v => 
      `<li style="background-color: ${v.color};">${v.id}</li>`
    ).join(''); 
    document.body.appendChild(list); 
    
    list.addEventListener('click', e => {
      if (!(e.target instanceof HTMLLIElement)) return; 
      const targetClr = e.target.style.backgroundColor, 
            siblings  = [...e.target.parentElement.children]; 
      const checkColor = el => el && (el.style.backgroundColor === targetClr); 
      let left, right;
      left = right = siblings.indexOf(e.target); 
      while (checkColor(siblings[left - 1])) left--; 
      while (checkColor(siblings[right + 1])) right++; 
      console.clear(); 
      console.log(`Отрезок: ${siblings[left].textContent}..${siblings[right].textContent}`); 
    }); 
    ul { list-style: none; display: flex; padding: 0; }
    li { flex: 0 0 50px; font: 1rem/50px sans-serif; text-align: center; box-shadow: 0 0 0 1px #ccc; }

    • 0
  3. Best Answer
    teran
    2020-04-17T17:39:32Z2020-04-17T17:39:32Z

    下面的代码纯粹是一个搜索功能,在输入处没有接口(以免混淆代码) - 来自段的元素的 ID。在输出 - 一个段。如何在单元格中单击并获取 ID 以将其传递给函数,我想它已经知道了。

    let arr = [
      { id: 'm2c', color: 'yellow' },
      { id: 'd1b', color: 'red' },
      { id: 'd6', color: 'red' },
      { id: 'd3', color: 'red' },
      { id: 'd4', color: 'red' },
      { id: 'd5', color: 'yellow' },
      { id: 'd6', color: 'yellow' },
      { id: 'd7', color: 'yellow' },
      { id: 'v1', color: 'yellow' },
      { id: 'c9', color: 'red' },
      { id: 'd1k', color: 'red' }, 
      { id: 'd92', color: 'red' },
      { id: 'd12', color: 'red' },
      { id: 'd31', color: 'red' },
      { id: 'd14', color: 'yellow' },
      { id: 'd12', color: 'yellow' },
      { id: 'd45', color: 'yellow' },
      { id: 'd3', color: 'yellow' },
      { id: 'd00', color: 'yellow' },
      { id: 'd3o', color: 'yellow' }
    ];
    
    
    
    function findRange(needle){
        var l = r = idx = arr.findIndex( v => v.id == needle);
        var color = arr[idx].color;
        
        while(l && arr[l].color ==  color) l--;
        while(r < arr.length && arr[r].color == color) r++;
                
        return arr.slice(l+1,r);    
    }
    
    var result = findRange('d14');
    console.log(result);

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5