如果数组中不存在索引,则在索引位置创建元素

时间:2018-07-02 09:21:25

标签: javascript arrays

我有一个包含ID和名称的数组对象

const stages = [{
  id: 1,
  name: ''
}, {
  id: 2,
  name: ''
}, {
  id: 3,
  name: ''
}, {
  id: 4,
  name: ''
}, {
  id: 5,
  name: ''
}, {
  id: 6,
  name: ''
}, {
  id: 7,
  name: ''
}, {
  id: 8,
  name: ''
}];

另外,我有一个包含数字的数组。

const indexPositions = [0, 1, 2, 2, 2, 3, 2, 0];

我想创建一个包含数组的第三个数组。 distances中的每个数字代表数组中当前数组的索引。

如果当前数组尚不存在,我想先创建它。显然,我必须创建新的数组,直到到达该索引位置。

示例: 我的数组在开始时是空的。第一个索引位置是0,所以我必须为此创建一个新数组。下一个索引位置是3,所以我必须创建更多数组,直到有4个数组。

我要做的就是将载物台推到正确的水平索引位置。该示例的结果将是

const levels = [
  [stage1, stage8],
  [stage2],
  [stage3, stage4, stage5, stage7],
  [stage6]
];

当前我的代码看起来是这样

$(document).ready(() => {
  const levels = []; // the array containing the arrays

  stages.forEach((stage, stageIndex) => {
    const indexPosition = indexPositions[stageIndex];

    const positionDifference = indexPosition - levels.length;

    if (positionDifference > 0) {
      for (let i = 0; i < positionDifference; i++) { // fill up with empty arrays
        levels.push([]);
      }
    }

    levels[indexPosition].push(stage);
  });
});

我收到此错误Uncaught TypeError: Cannot read property 'push' of undefined,这是因为indexPosition超出范围。如果positionDifference为0,则不会创建任何数组,但开始时该数组为空。

我尝试将levels.length设置为-1(如果它为0),但是如果差为1,我仍然会收到错误消息,我在位置0创建了一个数组,并想访问位置1。

如果空数组不存在,如何创建?

3 个答案:

答案 0 :(得分:1)

虽然我不完全了解您要做什么,但是检查数组元素的存在很简单,一种实现方法是将其强制为布尔值:

const thing=[];
function addElem(where,what){
  if(!thing[where])              // <- here
    thing[where]=[];
  thing[where].push(what);
}

addElem(2,1);
addElem(2,2);
addElem(2,3);
addElem(5,1);
console.log(thing);

(索引故意是不连续的,因为这无关紧要:JavaScript数组稀疏)

答案 1 :(得分:1)

您可以使用单个循环并为索引添加数组(如果不存在)。然后推送所需的值。

var stages = [{ id: 1, name: '' }, { id: 2, name: '' }, { id: 3, name: '' }, { id: 4, name: '' }, { id: 5, name: '' }, { id: 6, name: '' }, { id: 7, name: '' }, { id: 8, name: '' }],
    indexPositions = [0, 1, 2, 2, 2, 3, 2, 0],
    result = stages.reduce((r, o, i) => {
        var index = indexPositions[i];
        r[index] = r[index] || [];     // take default value for falsy value
        r[index].push('stage' + o.id); // instead of string take object
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

您实际上非常亲密!您的代码中有一个很小的问题。

$(document).ready(() => {
  const levels = []; // the array containing the arrays

  stages.forEach((stage, stageIndex) => {
    const indexPosition = indexPositions[stageIndex];

    const positionDifference = indexPosition - levels.length + 1; //YOU DID NOT ADD 1 HERE

    if (positionDifference > 0) {
      for (let i = 0; i < positionDifference; i++) { // fill up with empty arrays
        levels.push([]);
      }
    }

    levels[indexPosition].push(stage);
  });
});

在计算positionDifference时,当indexPosition等于0且for循环未运行且未推送新数组时,未添加1导致问题。只需添加一个即可解决问题:-)