根据某些键

时间:2018-03-28 17:16:55

标签: javascript arrays random key associative-array

我有一个类似的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}
];

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

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

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

感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分: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; }

答案 1 :(得分:0)

使用Array.map(),shuffle(取自此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 :(得分:0)

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

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

console.log(arrTest);