创建主数组的修改后属性的新数组

时间:2019-06-30 16:51:17

标签: javascript

这对我来说是一个挑战,我该如何正确编写代码?我真的需要一些帮助来解决它...

关于加权-实际上是随机的。我会尝试用我的英语不好的方法逐步解释这个问题:)很抱歉,如果在这里给出了不必要的信息,如果有人可以简化这个过程,我会很高兴...

假设我们要根据所需的体重随机选择一个城市名称。

在这里,我们有一个包含这些城市名称的对象数组,以及我们所需的样本权重以及每个城市与西部的距离。

var list = [
   { name: "New York", distance: 4, weight: 1 },
   { name: "Atlanta", distance: 3, weight: 1 },
   { name: "Dallas", distance: 2, weight: 1 },
   { name: "Los Angeles", distance: 1, weight: 1 },
];   

所以纽约很远,洛杉矶很近。好的,现在,我可以使用此功能根据城市的重量来选择城市(没有必要向您显示其背后的代码,但是如果您要查看它,可以随时询问。)

var random_item = getRandomItem(name, weight);
console.log(random_item);

此代码的结果是其中一个城市,例如纽约。

我的问题是:在拿起第一个城市后,我想要一个新的修改后的权重数组,以便:

A)给出已经拾取的城市权重0(这样就不能再次重复注意:这不是问题)。

B)使用以下逻辑,根据剩余城市与最后一个拾取城市的距离来修改权重:与离最后一个拾取城市不远的城市一样,它们的权重也会增加。 (换句话说,我想根据城市可能已经形成的最后一个城市来选择城市)

例如:如果纽约是第一个上车的城市,则纽约的权重应为0,并且距洛杉矶的距离为3(New York.distance:4 vs Los Angeles.distance:1)加Los angles.weight a 3使其变为4。

任何想法或解决方案都值得赞赏...

1 个答案:

答案 0 :(得分:4)

以下是反映我评论的答案:

  

您的逻辑将无法按照您的期望进行。以亚特兰大为随机城市:   亚特兰大的权重变为:0,纽约的权重变为:(3 - 4) + 1 = 0   -您有两个权重为零的权重。我建议不要添加当前重量。将提供一个有符号的值作为   无法重复的重量。

此答案将确保weight属性的唯一值。您可以想到负值向西移动,而正值从零加权位置向东移动。

var list = [
   { name: "New York", distance: 4, weight: 1 },
   { name: "Atlanta", distance: 3, weight: 1 },
   { name: "Dallas", distance: 2, weight: 1 },
   { name: "Los Angeles", distance: 1, weight: 1 },
];


// Given random city is Atlanta
let randomCity = "Atlanta";
let baseDistance = list.find(l => l.name == randomCity).distance;

let newList = list.map(c => {
  console.log();
  let newWeight = Math.abs(baseDistance - c.distance);
  return {
    name: c.name,
    distance: c.distance,
    weight: newWeight
  };
});

console.log(newList);

编辑:基于OP的评论,以及我对这种方式无法再次重复的明显误解实际上是什么意思(我认为唯一性是主意),我已将权重更改为绝对值。