【问题标题】:create an new array of modified property of main array创建主数组的修改属性的新数组
【发布时间】:2019-06-30 16:51:17
【问题描述】:

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

这是关于加权 - 实际上是随机化。我试着用我糟糕的英语一步一步地解释这个:) 很抱歉,如果这里提供了任何不必要的信息,如果有人能让这个更简单,我会很高兴......

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

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

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 and make it 4.

感谢任何想法或解决方案...

【问题讨论】:

  • 你的逻辑不会如你所愿。将亚特兰大作为随机城市:亚特兰大权重变为:0,纽约权重变为:(3 - 4) + 1 = 0 - 根据您的逻辑,您有两个权重为零。我建议不要添加当前重量。这将提供一个带符号的值作为不能重复的权重。

标签: javascript


【解决方案1】:

这是一个反映我评论的答案:

你的逻辑不会如你所愿。以亚特兰大为随机城市: 亚特兰大权重变为: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 的评论,以及我对 这种方式它不能再次重复 的实际含义的明显误解(我认为唯一性是这个想法),我已将权重更改为绝对值。

【讨论】:

  • 感谢您的回答...加一...但要提一提:我只关心城市距离之间差异的绝对值。如果给定的随机城市是亚特兰大,那么纽约和达拉斯应该被赋予相同的权重,因为它们与亚特兰大的绝对值距离差为 1。
  • 那么这个:这样就不能再重复了你的问题混淆了我对你问题的理解。这些值可以重复吗?
  • 对不起,由于我的英语不好造成的误解... 所选择的城市将不会被再次选择,因为它/它们的权重为 0。 选择亚特兰大后唯一的选择是提醒城市...
  • 您可以使用 find 而不是过滤器,它将返回对象而不是从零数组中获取 baseDistance
  • @DILEEPTHOMAS - 当然,可能是更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多