将索引数组分配为对象值

时间:2019-10-07 17:15:25

标签: javascript arrays loops indexing javascript-objects

我有一个任务需要我做,但是我真的很困并且无法取得进展。分配包含这样的元素数组

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

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

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

示例:

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];
}

能不能给我一个解决方法的提示,我真的很困惑。

3 个答案:

答案 0 :(得分: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的回答。 上面的答案是为了阐明基本思想并提示您如何思考

此外,可以直接使用appleHolderLine.length获得lineCount。

答案 1 :(得分:0)

这里您不需要额外的变量(行数),只需循环使用值,使用索引访问值,检查该键是否不存在,然后使用空数组初始化,将索引推入即可每次迭代中的关键

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

完全相同

答案 2 :(得分:-1)

我想,最简短的答案是实用的答案。

$conn = new PDO(sprintf("mysql:host=%s;dbname=%s", "localhost",  "kosan_finder"), "root", "");
$sql = "CALL getChats(?)";
$stmt = $conn->prepare($sql);
$stmt->bindValue(1, $PostData->sender);

$stmt->execute();
echo "Result stmt: ";
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
echo "\nError info: ";
print_r($stmt->errorInfo());

但是我不确定您是否期望提供功能性的解决方案。不过,您可能会发现它很有用。这个想法是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添加到特定字段,如果不是,则使用当前元素作为名称初始化该字段,并将索引作为单元素数组作为值初始化