【问题标题】:Assign a array of indexes as an object value将索引数组分配为对象值
【发布时间】:2020-02-05 00:39:35
【问题描述】:

我有一个任务需要完成,但我真的被卡住了,无法取得进展。赋值包含在这样的元素数组中

const appleHolderLine = ['Rome', 'Ambrosia', 'Rome', 'RedDelicious', 'Akane','RedDelicious', 'SweeTango', 'RedDelicious', 'RedDelicious', 'Opal', 'Winesap', 'RedDelicious', 'Empire', 'RedDelicious', 'Liberty'];

首先需要声明一个变量lineCount,它对数组的每个元素都计数,并引用一个名为appleMap的对象。

挑战在于遍历数组,数组的元素将是没有重复的对象键,而值将是数组特定元素位置的索引数组。举个例子:

例子:

const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']
console.log (lineCount, appleMap) 

应该记录:

5, {'GreenApples':[0], 'RedDelicious': [1,4], 'OrangeApples':[2], 'PurpleApples': [3]}

到目前为止我的进步

var lineCount = 0;
var appleMap = {};
for (let i = 0; i < appleHolderLine.length; i++){
    lineCount++;
    // if element in the array exist in the array  
    appleMap[appleHolderLine[i]] = [i];
}

你能告诉我如何解决这个问题吗,我真的被卡住了。

【问题讨论】:

    标签: javascript arrays loops indexing javascript-objects


    【解决方案1】:

    基本上你可以在第一次创建一个空数组并像下面这样继续推送

    var lineCount = 0;
    var appleMap = {};
    for (let i = 0; i < appleHolderLine.length; i++){
      lineCount++;
      if(!appleMap[appleHolderLine[i]])
        appleMap[appleHolderLine[i]] = []
      appleMap[appleHolderLine[i]].push(i);
    
     }
    

    您可以使用Array.prototype.reduce,这是 javascript 提供的更高级的构造。请参考下面 CodeManiac 的回答。 上面的答案是为了澄清基本思想并提示您如何思考

    另外,lineCount也可以直接使用appleHolderLine.length获取。

    【讨论】:

      【解决方案2】:

      这里不需要额外的变量(行数),只需循环使用值,使用索引访问值,检查该键是否不存在任何内容,然后用空数组初始化它,将索引推送到每次迭代的关键

      const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']
      var appleMap = {};
      for (let i = 0; i < appleHolderLine.length; i++){
        if(!appleMap[appleHolderLine[i]]){
          appleMap[appleHolderLine[i]] = []
        }
        appleMap[appleHolderLine[i]].push(i);
      }
      
      console.log(appleMap)

      您可以简单地使用reduce

      const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']
      
      let final = appleHolderLine.reduce((op,inp,i)=>{
        op[inp] = op[inp] || []
        op[inp].push(i)
        return op
      },{})
      
      
      console.log(final)

      行数与数组长度相同,let lineCount = appleHolderLine.length

      【讨论】:

        【解决方案3】:

        我想,最短的答案是功能性的。

        const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']
        
        result = appleHolderLine.reduce((a,c,i) => { if(a[c]) a[c].push(i); else a[c]=[i]; return a; }, {})
        
        console.log(result)

        但我不确定您是否应该提供实用的解决方案。不过,您可能会发现它很有用。这个想法是reduce 方法从一个空对象开始并遍历数组。在每次迭代中,它检查当前元素c 是否已经是累加器a 的一个字段。如果是,则将其索引i 添加到特定字段,如果不是,则使用当前元素作为名称初始化该字段,并将索引作为单元素数组作为值。

        【讨论】:

          猜你喜欢
          • 2019-03-30
          • 2016-05-16
          • 1970-01-01
          • 2019-06-16
          • 1970-01-01
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多