我有一个类似的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}
];
我已经找到了很多或随机化的数组讨论和函数,但似乎找不到一个针对特定键并使其他所有内容保持不变的内容。
感谢任何帮助。
谢谢!
答案 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);