【问题标题】:Randomize JavaScript Array of Objects Based on Certain Key根据某个键随机化 JavaScript 对象数组
【发布时间】:2018-09-07 11:53:23
【问题描述】:

我有一个类似这样的 JavaScript 数组:

arrTest = [
  {qId: 1, text:"test a", order: 1},
  {qID: 2, text:"test b", order: 2},
  {qID: 3, text:"test c", order: 3},
  {qID: 4, text:"test d", order: 4}
];

我想只随机化 order 键,以便所有其他键保持不变,并且数组的原始顺序保持不变:

arrTest = [
  {qId: 1, text:"test a", order: 3},
  {qID: 2, text:"test b", order: 1},
  {qID: 3, text:"test c", order: 4},
  {qID: 4, text:"test d", order: 2}
];

我找到了很多或随机化数组讨论和函数,但似乎找不到一个针对特定键并保持其他所有内容不变的内容。

感谢任何帮助。

谢谢!

【问题讨论】:

  • 你正在使用一个数组(它本质上是有序的)......为什么不使用它们的索引对对象进行排序并按键转储排序?

标签: javascript arrays random key associative-array


【解决方案1】:

使用Array.map() 提取订单,随机播放(取自answer)订单数组,Array.map() 使用新订单的原始数组:

const arrTest = [{"qId":1,"text":"test a","order":1},{"qID":2,"text":"test b","order":2},{"qID":3,"text":"test c","order":3},{"qID":4,"text":"test d","order":4}];

function shuffle(array) {
  for (let i = array.length - 1; i > 0; i--) {
      let j = Math.floor(Math.random() * (i + 1));
      [array[i], array[j]] = [array[j], array[i]];
  }
  
  return array;
}

const result = shuffle(arrTest.map((o) => o.order))
  .map((order, i) => ({
    ...arrTest[i],
    order
  }));
  
console.log(result);

【讨论】:

    【解决方案2】:

    您可以映射order 并将随机值分配回属性。

    var arrTest = [{ qId: 1, text:"test a", order: 1 }, { qID: 2, text:"test b", order: 2 }, { qID: 3, text:"test c", order: 3 }, { qID: 4, text:"test d", order: 4 }],
        random = arrTest.map(({ order }) => order);
        
    arrTest.forEach(o => o.order = random.splice(Math.floor(Math.random() * random.length), 1)[0]);
    
    console.log(arrTest);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 使用拼接的好技巧!我得到了几乎相同的答案,但我一直坚持从数组中删除已经分配的内容。顺便说一句,您可以使用0| Math.random() * random.length 而不是Math.floor,但这绝对不利于可读性。
    • 我最终使用了与您上面的代码非常相似的东西。我喜欢随机数组的 .splice() 最终使顺序随机。谢谢!
    【解决方案3】:

    对于这样的任务,我会使用 lodash 库 (https://lodash.com/docs),它有很多不错的功能,我个人将这个库附加到我正在做的每个 javascript 项目中。这是示例解决方案:

    _(arrTest)
       .map(element => element.order)
       .shuffle()
       .each( (order, index) => arrTest[index].order = order);
    
    console.log(arrTest);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-18
      • 2019-01-31
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多