对于每个数组值,检查它是不是在 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-23
与2017-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 日期匹配,这将返回 true
到 yourKey
。是这样吗?
[编辑]
如果你想检查每个 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)