检查json对象中的数组元素

时间:2016-07-01 06:37:46

标签: javascript jquery

我有一个数组:

var arr = [20122, 20133, 20144, 20155, 20177];

我有一个JSON对象:

[{
    "ext": "20177",
    "name": "SIP\/20177-000001e8",
    "state": "Ringing"
}, {
    "ext": "20122",
    "name": "SIP\/20122-000001e7",
    "state": "Ringing"
}]

我需要检查数组作为输入,并检查JSON对象中是否存在数组值。

我试过如下:

var arr = [20122, 20133, 20144, 20155, 20177];
jQuery.map(resp, function(obj) {
  if(jQuery.inArray(obj.ext,arr) == -1){
    //not exist
  }                     
})

但是这里JSON是输入。但我需要数组作为输入。

6 个答案:

答案 0 :(得分:1)

我假设您在resp中没有真正的JSON(字符串)(请记住,JSON是用于数据交换的文本符号;如果您正在处理JavaScript源代码,而不是处理字符串,你不是在处理JSON),但是它已经被解析成了一个对象数组(如果{{1},jQuery可能会为你做这件事。是ajax调用的响应)。 (如果resp是包含resp的字符串,请使用JSON进行解析,然后继续其余的答案。)

JSON.parse执行inArray(类型和值)检查。您的数组包含数字。对象的===属性值为 strings

更改数组以包含字符串,或者在比较时将ext属性值转换为数字:

ext

另请注意,您通常会使用if(jQuery.inArray(+obj.ext,arr) == -1){ // ---------------^ 的返回值;否则,你会使用jQuery.map

示例(如果您使用结果,请保留jQuery.each):

jQuery.map
var resp = [{"ext":"20177","name":"SIP\/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP\/20122-000001e7","state":"Ringing"}];

var arr = [20122, 20133, 20144, 20155, 20177];
jQuery.map(resp, function(obj) {
  if(jQuery.inArray(+obj.ext,arr) == -1){
    // -------------^
    console.log("Not found: " + obj.ext);
  } else {
    console.log("Found: " + obj.ext);
  }
});

旁注:如果您使用的是模糊的现代浏览器,则可以使用内置数组功能,而不是<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>jQuery.mapjQuery.each:它们是数组本身上的jQuery.inArraymapforEach方法。它们在旧版浏览器上都是可填充/可上传的。

例如:

indexOf
var resp = [{"ext":"20177","name":"SIP\/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP\/20122-000001e7","state":"Ringing"}];

var arr = [20122, 20133, 20144, 20155, 20177];
resp.forEach(function(obj) {
  if(arr.indexOf(+obj.ext) == -1){
    console.log("Not found: " + obj.ext);
  } else {
    console.log("Found: " + obj.ext);
  }
});

答案 1 :(得分:1)

如果输入是JSON,那么您需要先解析它:var data = JSON.parse(resp);。示例:

&#13;
&#13;
var arr = [20122, 20133, 20144, 20155, 20177];
var resp = '[{"ext":"20177","name":"SIP\/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP\/20122-000001e7","state":"Ringing"}]';

var data = JSON.parse(resp); //<-- You need this to convert json to array

jQuery.each(data, function(i, obj) {
  if(jQuery.inArray(obj.ext, arr) == -1){
    console.log(obj.name+' Exists');
  }                     
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

 var arr = [20122, 20133, 20144, 20155, 20177],
resp = [{"ext":"20177","name":"SIP\/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP\/20122-000001e7","state":"Ringing"}],

 $.each(arr, function (i, arritem) {
            $.each(resp , function (i, jsonitem) {
               if(obj.ext==arritem)
               {
               //match
               }
               else
               {
                //not match
               }
            }
 }

答案 3 :(得分:1)

根据您的要求“但我需要数组作为输入” - 请考虑使用ES6“方式”中Array.forEachArray.map函数的以下解决方案:

var arr = [20122, 20133, 20144, 20155, 20177],
    resp = [{"ext":"20177","name":"SIP\/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP\/20122-000001e7","state":"Ringing"}],
    exts = resp.map((o) => +o.ext),
    result = {};

arr.forEach((v) => result[v] = (exts.indexOf(v) !== -1)? 1 : 0 );

console.log(result);
// value 1 means that arr value exists within json objects, 0 - not exists
// Object {20122: 1, 20133: 0, 20144: 0, 20155: 0, 20177: 1}

答案 4 :(得分:0)

试试这个:

$('document').ready(function() {
  var arr = [20122, 20133, 20144, 20155, 20177];
  var oJson = [{"ext":"20177","name":"SIP/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP/20122-000001e7","state":"Ringing"}]

  $('button').on('click', function(e) {
    var newArr = [];
    
    $.each(oJson, function(key, value) {
      if ($.inArray(value.ext, arr))
        newArr.push(value.ext);
    });
    
    console.log(newArr);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button>Check</button>

答案 5 :(得分:0)

我认为您可以使用find数组方法&amp; forEach检查json中是否存在元素

如果存在这样的json对象,find将返回该对象,否则它将返回undefined。 +用于字符串到数字转换,因为在arr中元素是数字,而在jsonObj中它们是字符串

var arr = [20122, 20133, 20144, 20155, 20177];
var jsonObj=[{"ext":"20177","name":"SIP\/20177-000001e8","state":"Ringing"},{"ext":"20122","name":"SIP\/20122-000001e7","state":"Ringing"}]

arr.forEach(function(item){
 var _getValue ="";  
     var _isPresent=jsonObj.find(function(item2){
      if(item == +item2.ext){
        return item2;
       }
        else{
         return false;
        }
})
if(_isPresent !== undefined){
   _getValue =_isPresent.ext;
}
else{
  _getValue="Not matched";
}
document.write('<pre>'+_getValue+'</pre>')
})

JSFIDDLE