【问题标题】:How to find the values of next array elements?如何找到下一个数组元素的值?
【发布时间】:2018-09-14 13:48:26
【问题描述】:

我们知道 find() 方法返回通过测试函数的第一个数组元素的值。

但在以下情况下,如果我需要所有元素怎么办?

<p id="myPEle">
</p>

const listIds = ["Vanilla","Vanilla"];
const itemId = 'Vanilla';
for(let i=0; i< listIds.length; i++){
    const result = listIds.findIndex(id => id === itemId)
    document.getElementById("myPEle").innerHTML += result;
}

我需要结果是“01”而不是“00”

【问题讨论】:

  • 如果你需要所有元素,那么使用.filter怎么样?

标签: javascript arrays ecmascript-6


【解决方案1】:

const listIds = ["Vanilla", "Vanilla"];
const itemId = 'Vanilla';

const result = listIds.filter(id => id === itemId) //use filter method
                      .map((item,index)=>index) //get array of index of filtered items
                      .join("");  //join array item

document.getElementById("myPEle").innerHTML = result ;
&lt;p id="myPEle"&gt;&lt;/p&gt;

如果 listIds 数组的大小很大,那么我建议使用“array.reduce”而不是过滤器,以避免对数组进行多次迭代 它将在一次迭代中执行过滤和映射 查看 reduce的更多信息

【讨论】:

  • 结果不应该是数组索引,而不是值吗? "我需要结果是 '01' 而不是 '00'"
  • @Ihor 老实说,这有点不清楚。标题指的是值,代码示例使用索引。我通常会按照代码示例进行操作,但是...这没有多大意义,似乎 OP 将其用作查看匹配项的调试方式,而不是因为实际需要索引。
  • 这可以只用forEach().....请查看我的答案。此外,您还应该考虑使用innerHTML 在每次迭代中更改 HTML 时的性能。
【解决方案2】:

在循环的两次迭代中,您都会获得相同的索引 (0),因为

findIndex() 方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回 -1。

您可以使用forEach() 来检查每次迭代中的项目。如果当前项等于itemId,则可以存储索引。

请注意:要将文本添加到元素中,最好使用textContent 而不是innerHTML

const listIds = ["Vanilla","Vanilla"];
const itemId = 'Vanilla';
listIds.forEach(function(el,i){
    if(itemId == el)
    document.getElementById("myPEle").textContent += i;
});
<p id="myPEle">
</p>

【讨论】:

    【解决方案3】:

    这是一种使用reducejoin 原型方法的方法。我在listIds 中添加了几个额外的字符串以表明它有效:

    function generateIdxString(array, target) {
      return listIds.reduce((a, el, idx) => {
        if (el === itemId) {
          a.push(idx);
        }
        return a;
      }, []).join('');
    }
    
    const listIds = ["Vanilla", "Vanilla", "Chocolate", "Strawberry", "Vanilla"];
    const itemId = "Vanilla";
    
    document.querySelector('#myPEle').innerHTML = generateIdxString(listIds, itemId);
    &lt;p id="myPEle"&gt;&lt;/p&gt;

    【讨论】:

      【解决方案4】:

      我需要结果是“01”而不是“00”

      如果您确实需要获取索引而不是值 - 使用 map 函数。

      const listIds = ["Vanilla","Vanilla"];
      const itemId = 'Vanilla';
      const result = listIds.map((id, index) => id === itemId && index)
                            .filter(x => x !== false); // Thanks @vlaz
      console.log(result); // [0,1]
      

      否则 - 使用filter 方法

      const listIds = ["Vanilla","Vanilla"];
      const itemId = 'Vanilla';
      const result = listIds.filter(id => id === itemId);
      console.log(result); // ["Vanilla","Vanilla"]
      

      【讨论】:

      • id === itemId &amp;&amp; index - 你可能需要添加一个额外的.filter(x =&gt; x !== false) 否则输入["Vanilla", "Fred", "Vanilla"] 你会得到[0, false, 2]
      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多