如何在此jQuery集合中仅选择具有不同键的对象?

时间:2015-06-28 00:28:07

标签: javascript jquery

[Object, Object, Object, prevObject: jQuery.fn.init[3], context: undefined]
  0: Object
    1: 1
    2: 2
    3: 7
   __proto__: Object
  1 : Object
    1: 6
    2: 2
    3: 5
    6: 15
    __proto__: Object
  2 : Object
    1: 3
    2: 2
    3: 5
    5: 7
    __proto__: Object
  context: undefined
  length: 3
  prevObject: jQuery.fn.init[3]
  __proto__: jQuery[0]

您会注意到每个对象都具有相同的键:1,2,3

但第二个对象有键:6 ,第三个对象有键:5

我需要选择这些键(或键/值对)。

我该怎么做?如果有一个好的库,我可以使用库。

3 个答案:

答案 0 :(得分:0)

在我看来,你正在以错误的方式使用JQuery。您的JQuery对象中应该有DOM对象,如果您查看JQuery对象中的context属性,则表示未定义..

除此之外,要按键和值相等进行过滤,我建议如下:

var yourCollection = [{1:1, 2:2, 3:7}, 
                      {1:6, 2:2, 3:5, 6:15}, 
                      {1:3, 2:2, 3:5, 5:7}];
yourCollection.forEach(function(item){
    Object.keys(item).forEach(function(property){
      if(parseInt(property, 10) % item[property] === 0){
        delete item[property];
      }
    })
})

输出是:

[[object Object] {
 3: 7
}, [object Object] {
 1: 6,
 3: 5,
 6: 15
}, [object Object] {
 1: 3,
 3: 5,
 5: 7
}]

编辑:通过对称差异过滤收集。你说你会同意使用lib,所以我建议使用lodash(实用程序库)。

var yourCollection = [{1:1, 2:2, 3:7}, 
                      {1:6, 2:2, 3:5, 6:15}, 
                      {1:3, 2:2, 3:5, 5:7}];


var keyMap = _.map(yourCollection, function(item){
  return _.map(Object.keys(item), function(property){
    return parseInt(property, 10);
  })
})

var reducedKeyMap = _.xor(_.flatten(_.initial(keyMap)), _.last(keyMap));

var symmetricDifference = [];
symmetricDifference = _.reduce(yourCollection, function(result, next, index, collection){
  var substrat = _.pick(next, reducedKeyMap);
  if(!_.isEmpty(substrat)){
    result.push(substrat);
  }
  return result;
}, [])

document.write(JSON.stringify(symmetricDifference));

输出是:

[{"6":15},{"5":7}]

Running example

答案 1 :(得分:0)

执行嵌套循环并匹配键。

var arr = [
{ 1: 1, 2: 2, 3: 7 },
{ 1: 6, 2: 2, 3: 5, 6: 15 },
{ 1: 3, 2: 2, 3: 5, 5: 7 },
];
var output = document.getElementById('output');
for(var x=0;x<arr.length;x++){
    for(var key in arr[x]){
        var keysToAvoid = ['1','2','3'];
        if(keysToAvoid.indexOf(key) == -1){
           output.innerHTML = output.innerHTML + arr[x][key] + '<br>'; //gotcha!
        }
    }
}
<span id="output"></span>

答案 2 :(得分:0)

  

但第二个对象有键:6 ,第三个对象有键:5

     

我需要选择这些键(或键/值对)。

尝试使用keys.map()Object.keys().slice().splice()创建包含要过滤的对象内属性的数组.indexOf()过滤obj的属性键; .filter()删除undefined.get()以将返回值从jQuery对象转换为Array;当.map()定义为返回过滤值数组

时,在obj上调用keys

var obj = $([{
  1: 2,
  2: 2,
  3: 7
}, {
  1: 6,
  2: 2,
  3: 5,
  6: 15
}, {
  1: 3,
  2: 5,
  3: 5,
  5: 7
}]);
// But second object has a key: 6 and the third object has a key: 5
var keys = $(obj).map(function(index, value) {
  // return array of property keys from `obj`
  return Object.keys(value)
}).get().map(function(v, k, arr) {
  // `j`: copy of original array of property keys from `obj`,
  // `i`: current value `v` removed from `j` utilizing `k` index
  var j = arr.slice(), i = j.splice(k, 1)[0];
  // if copy of `arr` `j` does not contain `v` a duplicate entry of `v`,
  // return `i`: `v` removed from `j`, else return `null` 
  return j.indexOf(v) === -1 ? i : null
}).filter(Boolean) // `["6", "5"]`
// return array of values , where item within `keys` property of 
// an object within `obj` 
, res = $(obj).map(function(key, val) {
    var i = Object.keys(val).filter(function(v, k) {
      return keys.indexOf(v) !== -1
    })[0];
    return val[i];
}).get();
// do stuff with `res`
document.write(res); // from `obj` property, value `6:15` , `5:7` : `15, 7`
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>