对于每个数组值,检查它是不是在 json 数组中。如果是跳过 json 数组进行下一次迭代

Posted

技术标签:

【中文标题】对于每个数组值,检查它是不是在 json 数组中。如果是跳过 json 数组进行下一次迭代【英文标题】:For each array value check if it is in a json array. If it is skip json array for next iteration对于每个数组值,检查它是否在 json 数组中。如果是跳过 json 数组进行下一次迭代 【发布时间】:2018-01-30 04:38:00 【问题描述】:

对不起,如果标题有点混乱。不知道还能怎么说...

我有一个日期数组:

var dateRange = ["2017-08-21", "2017-08-22", "2017-08-23", "2017-08-24", "2017-08-25", "2017-08-26", "2017-08-27"];

我还有一个包含日期的 json 数据数组。

var jsonArray = [
    
         date: "2017-08-21",
         edit: false,
         text: "some text"
    ,
    
         date: "2017-08-23", //notice skipped 2017-08-22
         edit: false,
         text: "some text"
    ,
    ...
];

所以我想做的是检查jsonArray 中的每个日期dateRange,如果dateRange 不存在于jsonArray 的任何日期,请执行一些操作。

我正在做的事情是为dateRange 中的每个日期执行indexOf,但我意识到与"2017-08-21" 相比,例如"2017-08-23" 会被触发,但我不希望这样,因为@ 987654332@实际上存在于数组中...

这有意义吗?

感谢您的帮助!

【问题讨论】:

“我也有一个 json 数组” - 不,你有一个对象数组;这个问题中没有 JSON。无论如何,我不明白你关于为什么 indexOf() 不起作用的注释,因为 .indexOf() 不会匹配 "2017-08-23" 和 "2017-08-21" - 你能不能 edit 你的显示您尝试过的代码的问题? @nnnnnn 问题是,如果indexOf() 失败,它将因为将2017-08-232017-08-21 进行比较是错误的......我想检查数组元素是否在哪里在对象数组中。这是否更有意义? 并非如此。如果您正在迭代 jsonArray 中的项目并想测试当前项目的日期是否不在另一个数组中,您可以说 if (dateRange.indexOf(jsonArray[i].date) === -1) 【参考方案1】:

我不知道我是否得到它,但您想检查jsonArray 中的任何项目是否包含dateRange 中的日期,对吗?

你可以这样做:

let yourKey = jsonArray.some((item) => return dateRange.contains(item.date) )

如果任何 jsonArray 项目日期与 dateRange 日期匹配,这将返回 trueyourKey。是这样吗?

[编辑]

如果你想检查每个 json 数组项并做一些你可以做的事情:

jsonArray.forEach((item) => 
    if (dateRange.contains(item.date)) 
        // The date is in the array, do something
     else 
        // The date is not in the array, do something else.
    
)

【讨论】:

【参考方案2】:

简单的 O(n^2) 方法是:

var jsonArray = [
    
         date: "2017-08-21",
         edit: false,
         text: "some text"
    ,
    
         date: "2017-08-23", //notice skipped 2017-08-22
         edit: false,
         text: "some text"
    ,
];

var dateRange = ["2017-08-21", "2017-08-22", "2017-08-23", "2017-08-24", "2017-08-25", "2017-08-26", "2017-08-27"];

for(var i = 0; i < dateRange.length; i++)
   for(var j = 0; j < jsonArray.length; j++)
      if(dateRange[i] == jsonArray[j].date)
        console.log("Date Found:" + dateRange[i]);
      
   
   

【讨论】:

【参考方案3】:

是这样的:

function DateRangeTester(startDateString, endDateString)
  var start = new Date(startDateString).getTime();
  var end = new Date(endDateString).getTime();
  this.test = function(testDateString, passFunc, failFunc, passFuncContext, failFuncContext)
    var pc = passFuncContext || this;
    var fc = failFuncContext || this;
    var test = new Date(testDateString).getTime();
    if(test >= start && test <= end)
      passFunc.call(pc, testDateString);
    
    else
      failFunc.call(fc, testDateString);
    
  

var range = new DateRangeTester('2017-08-21 00:00:00', '2017-08-27 00:00:00');
var jsonArray = [
  
    date: '2017-08-21',
    edit: false,
    text: 'some text'
  ,
  
    date: '2017-08-28', // outside range
    edit: false,
    text: 'some text'
  ,
  
    date: '2017-08-23', //not sure I understand your comment
    edit: false,
    text: 'some text'
  ,
  
    date: '2017-08-20', // outside range
    edit: false,
    text: 'some text'
  
];
for(var i=0,ds,l=jsonArray.length; i<l; i++)
  ds = jsonArray[i].date;
  range.test(ds+' 00:00:00', function(r)
    console.log(r+' passed the test');
  , function(r)
    console.log(r+' failed the test');
  );

【讨论】:

以上是关于对于每个数组值,检查它是不是在 json 数组中。如果是跳过 json 数组进行下一次迭代的主要内容,如果未能解决你的问题,请参考以下文章

检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)

检查 JSON 关联数组中是不是存在值

检查 JSON 密钥是不是存在

复选框数组返回nodejs中的最后一个检查值,而不是整个数组

检查 Json 数组是不是包含逻辑应用程序中的对象

检查 JSON 文件中是不是存在数组 - iOS