2016-11-25 21 views
1

我有一个数组mainArray包含对象的n阵列和我需要的所有元素从mainArray比较,以检查是否从每个对象的属性id在其他对象存在比较:
- 如果找到,则检查其他属性是否相同,如果不相同则返回id
- 如果mainArray[n]中至少有一个不具有该对象,则返回id的Javascript如何将第一元件从阵列与其它元件

下面是一些例子:
实施例1:

mainArray = [ 
    [ 
    { 
     "id":"trackingcode", 
     "classification": 
     [ 
     { 
      "name":"Creative Elements", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Campaigns", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    }, 
    { 
     "id":"evar9", 
     "classification": 
     [ 
     { 
      "name":"Type", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Domain", 
      "description":"", 
      "type":"text", 
      "date_enabled":false, 
      "children": 
      [ 
      { 
       "name":"sub classification", 
       "description":"", 
       "type":"text", 
       "parent_name":"Domain", 
       "date_enabled":false 
      } 
      ] 
     } 
     ] 
    } 
    ], 
    [ 
    { 
     "id":"trackingcode", 
     "classification": 
     [ 
     { 
      "name":"Creative Elements", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Campaigns", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    } 
    ] 
] 

mainArray [0] == mainArray [1] =>返回[ “evar9”]
- mainArray [1]不具有与属性"id": "evar9"

实施例2的对象:

mainArray = [ 
    [ 
    { 
     "id":"evar9", 
     "classification": 
     [ 
     { 
      "name":"Type", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Domain", 
      "description":"", 
      "type":"text", 
      "date_enabled":false, 
      "children": 
      [ 
      { 
       "name":"sub classification", 
       "description":"", 
       "type":"text", 
       "parent_name":"Domain", 
       "date_enabled":false 
      } 
      ] 
     } 
     ] 
    } 
    ], 
    [ 
    { 
     "id":"trackingcode", 
     "classification": 
     [ 
     { 
      "name":"Creative Elements", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Campaigns", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    } 
    ], 
    [ 
    { 
     "id":"trackingcode", 
     "classification": 
     [ 
     { 
      "name":"Creative Elements", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Campaigns", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    }, 
    { 
     "id":"evar1", 
     "classification": 
     [ 
     { 
      "name":"Creative", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Variables", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    } 
    ] 
] 

返回[ “trackingcode”,“ evar1" ,‘evar9’]
- mainArray[0]不具有与该属性"id": "trackingcode"
一个对象 - mainArray[0]mainArray[1]不具有与所述属性的对象"id": "evar1"
- mainArray[1]mainArray[2]不具有对象与属性"id": "evar9"

实施例3:

mainArray = [ 
    [ 
    { 
     "id":"trackingcode", 
     "classification": 
     [ 
     { 
      "name":"Creative Elements", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Campaigns", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    }, 
    { 
     "id":"evar9", 
     "classification": 
     [ 
     { 
      "name":"Type", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Domain", 
      "description":"", 
      "type":"text", 
      "date_enabled":false, 
      "children": 
      [ 
      { 
       "name":"sub classification", 
       "description":"", 
       "type":"text", 
       "parent_name":"Domain", 
       "date_enabled":false 
      } 
      ] 
     } 
     ] 
    } 
    ], 
    [ 
    { 
     "id":"trackingcode", 
     "classification": 
     [ 
     { 
      "name":"Creative Elements", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Campaigns", 
      "description":"", 
      "type":"text", 
      "date_enabled":true 
     } 
     ] 
    }, 
    { 
     "id":"evar9", 
     "classification": 
     [ 
     { 
      "name":"Type", 
      "description":"", 
      "type":"text", 
      "date_enabled":false 
     }, 
     { 
      "name":"Domain", 
      "description":"", 
      "type":"text", 
      "date_enabled":false, 
      "children": 
      [ 
      { 
       "name":"different name", 
       "description":"different description", 
       "type":"text", 
       "parent_name":"Domain", 
       "date_enabled":false 
      } 
      ] 
     } 
     ] 
    } 
    ] 
] 

返回[ “evar9”]
- 的"children"属性不同

+0

为什么不''evar1''以及在最后一个问题? –

+1

@NinaScholz对不起,我以为我删除了那个对象。现在检查。 – Valip

回答

1

您可以迭代和计算具有相同名称的对象并进行检查,如果发现一些相等的id

此建议使用JSON.stringify,因为我认为数据是相等的,并且属性的顺序是相同的。

/** 
 
* Checks every array for sameness and returns only different id 
 
* 
 
* @param {array} array An array with nested arrays with object, with property id 
 
* @return Difference. 
 
*/ 
 
function check(array) { 
 

 
    // create object without prototypes 
 
    var count = Object.create(null); 
 

 
    // iterate given array 
 
    array.forEach(function (a, i) { 
 
    
 
     // and the inner array 
 
     a.forEach(function (b, j) { 
 

 
      // check if id exist, if not take a new object with count, 
 
      // objects and same for later check 
 
      count[b.id] = count[b.id] || { count: 0, objects: [], same: true }; 
 

 
      // increment count for later check with the length of the given array 
 
      count[b.id].count++; 
 

 
      // save actual object for check for sameness 
 
      count[b.id].objects.push(b); 
 

 
      // if count is greater than one, test obejct for equality 
 
      if (count[b.id].count > 1) { 
 

 
       // assign to property same result of test with serialized objects 
 
       count[b.id].same = count[b.id].same && JSON.stringify(count[b.id].objects[0]) === JSON.stringify(b); 
 
      } 
 
     }); 
 
    }); 
 

 
    // get all keys and return only the keys which count is not equal 
 
    // to the lenght of the given array or which objects are not equal 
 
    return Object.keys(count).filter(function (k) { 
 
     return count[k].count !== array.length || !count[k].same; 
 
    }); 
 
} 
 

 
var mainArray1 = [[{ "id": "trackingcode", "classification": [{ "name": "Creative Elements", "description": "", "type": "text", "date_enabled": false }, { "name": "Campaigns", "description": "", "type": "text", "date_enabled": true }] }, { "id": "evar9", "classification": [{ "name": "Type", "description": "", "type": "text", "date_enabled": false }, { "name": "Domain", "description": "", "type": "text", "date_enabled": false, "children": [{ "name": "sub classification", "description": "", "type": "text", "parent_name": "Domain", "date_enabled": false }] }] }], [{ "id": "trackingcode", "classification": [{ "name": "Creative Elements", "description": "", "type": "text", "date_enabled": false }, { "name": "Campaigns", "description": "", "type": "text", "date_enabled": true }] }]], 
 
    mainArray2 = [[{ "id": "evar9", "classification": [{ "name": "Type", "description": "", "type": "text", "date_enabled": false }, { "name": "Domain", "description": "", "type": "text", "date_enabled": false, "children": [{ "name": "sub classification", "description": "", "type": "text", "parent_name": "Domain", "date_enabled": false }] }] }], [{ "id": "trackingcode", "classification": [{ "name": "Creative Elements", "description": "", "type": "text", "date_enabled": false }, { "name": "Campaigns", "description": "", "type": "text", "date_enabled": true }] }], [{ "id": "trackingcode", "classification": [{ "name": "Creative Elements", "description": "", "type": "text", "date_enabled": false }, { "name": "Campaigns", "description": "", "type": "text", "date_enabled": true }] }, { "id": "evar1", "classification": [{ "name": "Creative", "description": "", "type": "text", "date_enabled": false }, { "name": "Variables", "description": "", "type": "text", "date_enabled": true }] }]], 
 
    mainArray3 = [[{ "id": "trackingcode", "classification": [{ "name": "Creative Elements", "description": "", "type": "text", "date_enabled": false }, { "name": "Campaigns", "description": "", "type": "text", "date_enabled": true }] }, { "id": "evar9", "classification": [{ "name": "Type", "description": "", "type": "text", "date_enabled": false }, { "name": "Domain", "description": "", "type": "text", "date_enabled": false, "children": [{ "name": "sub classification", "description": "", "type": "text", "parent_name": "Domain", "date_enabled": false }] }] }], [{ "id": "trackingcode", "classification": [{ "name": "Creative Elements", "description": "", "type": "text", "date_enabled": false }, { "name": "Campaigns", "description": "", "type": "text", "date_enabled": true }] }, { "id": "evar9", "classification": [{ "name": "Type", "description": "", "type": "text", "date_enabled": false }, { "name": "Domain", "description": "", "type": "text", "date_enabled": false, "children": [{ "name": "different name", "description": "different description", "type": "text", "parent_name": "Domain", "date_enabled": false }] }] }]]; 
 

 
console.log(check(mainArray1)); 
 
console.log(check(mainArray2)); 
 
console.log(check(mainArray3));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

这个作品很完美,谢谢!我需要仔细研究这些代码以了解其中发生了什么......如果您可以在代码中添加几条注释,它会对我有很大帮助... – Valip

+1

请参阅编辑,我将处理表单索引更改为对象。 –

相关问题