在数组中查找前一个对象

3
    var arr = ["10/27/2017","11/5/2017","11/5/2017","11/10/2017","11/10/2017","12/12/2017"];
    var userDate = "11/10/2017";

如果我想在这个(假设已排序)数组中找到一个日期,它恰好在用户日期之前,我该怎么办?所以在这种情况下,我想返回11/5/2017
基本上,是在数组中找到指定日期左侧的最接近的对象。更进一步地说,如果我想再次检查前一个元素,但想避免重复,那将很有帮助。

2
请查看 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf ,您只需要从结果中减去1,或者搜索如何在数组中查找字符串。 - Huangism
尝试使用此链接 https://jsfiddle.net/mplungjan/gL97wq2q/ 来查找日期之间的差异 - 我没有完成它,但代码可以进行调试。 - mplungjan
@mplungjan 谢谢,我很感激。 - jc1234
6个回答

3

您可以使用Array#indexOf方法。

不要忘记检查元素是否存在且不是第一个,使用arr.indexOf(userDate) > 0进行判断。

let arr = ["10/27/2017","11/5/2017","11/10/2017","11/10/2017","12/12/2017"];
let userDate = "11/10/2017";

let result = arr.indexOf(userDate) > 0 ? arr[arr.indexOf(userDate) - 1] : null;
console.log(result);


为什么要踩我呢? - Zenoo
1
他们可能在给我们点踩是为了惩罚我们回答一个需要更多调查的问题。 - mplungjan
2
每个答案都假设'userDate'始终在数组中,而不是例如'11/8/2017' - 它没有考虑到中间日期,这很可能是原始问题想要的。 - TKoL
1
你为什么要调用两次 indexOf?这可能就是你被踩的原因。说实话,我也因此犹豫是否要踩你。 - ibrahim mahrir
1
@mplungjan 已经点赞了。 - ibrahim mahrir
显示剩余10条评论

1
相当简单,使用Array.indexOf

var arr = ["10/27/2017", "11/5/2017", "11/10/2017", "11/10/2017", "12/12/2017"];
var userDate = "11/10/2017";
var prev = arr.indexOf(userDate); // One call to indexOf - DRY
console.log(
   prev > 0 ? // neither the first (==0) nor not found (==-1)
   arr[prev-1] : "no earlier date"
);


或者,您可以在数组上定义一些原型方法,以便在给定可选初始索引的情况下查找值。https://jsfiddle.net/MrPolywhirl/quLe0tgd/ - Mr. Polywhirl
测试中间值,请使用此链接 https://jsfiddle.net/mplungjan/gL97wq2q/ 我没有时间完成它。 - mplungjan

0

您可以使用 indexOf 来获取日期的索引。然后就很容易得到前一个值了。

您可以尝试以下代码:

var arr = ["10/27/2017","11/5/2017","11/10/2017","11/10/2017","12/12/2017"];
var userDate = "11/10/2017";
    
var index = arr.indexOf(userDate); // Get the index
var previous = index > 0 ? arr[index - 1] : null; // Check if the date exists. If it does exists get the previous value or set it to null
console.log(previous)


0

我认为indexOf是解决这个问题的最佳方法。

var arr = ["10/27/2017", "11/5/2017", "11/10/2017", "11/10/2017", "12/12/2017"];
var userDate = "11/10/2017";
var index = arr.indexOf(userDate);
var result = "";

if (index < 0) { // no match case
  result = 'no match';
} else if (index == 0) { // userdate is first element
  result = 'userDate is first element';
} else { // get the result
  result = arr[index - 1];
}
console.log('result=', result);


-2
arr[arr.indexOf(userData) - 1] ? arr[arr.indexOf(userData) - 1] : throw new Error('...');

如果你坚持的话。 我更喜欢在实际使用时处理值未定义的情况。


请添加解释并处理日期不是第一个或未找到的情况。 - mplungjan

-2
var arr = ["10/27/2017","11/5/2017","11/10/2017","11/10/2017","12/12/2017"];

function findLeft(argum) {
  let firstIndex = arr.indexOf(argum);
  let leftside = firstIndex - 1;
  //you need to figure out error handling for < 0;

  return arr[leftside]; 
}

没有调用或测试<=0。 - mplungjan
@mplungjan,你看到“你需要错误处理”的评论了吗?我不确定OP的错误情况是什么,他/她应该能够添加所需的错误处理。 - nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接