-1

I want to make an object with having Key and unique value by iterating an array of objects up to its length.

I have my Json as

var data = [
            {sex: 'male', beaconKey: '121', userKey: '01', key:'k1', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 20, preferenceList: ['Fashion','Business','Sports'], ageGroup: 'LESS_THAN_15'}
            , {sex: 'male', beaconKey: '122', userKey: '01', key:'k2', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 22, preferenceList: ['Business'], ageGroup: 'BETWEEN_25_35'}
            , {sex: 'female', beaconKey: '123', userKey: '01', key:'k3', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 26, preferenceList: ['Housing'], ageGroup: 'BETWEEN_35_45'}
            , {sex: 'male', beaconKey: '121', userKey: '03', key:'k4', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 38, preferenceList: ['Business','Housing','Sports'], ageGroup: 'BETWEEN_25_35'}
            , {sex: 'female', beaconKey: '124', userKey: '03', key:'k5', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 20, preferenceList: ['Business','Housing','Sports'], ageGroup: 'BETWEEN_45_55'}
            , {sex: 'male', beaconKey: '125', userKey: '01', key:'k6', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 42, preferenceList: ['Jewels','Kids'], ageGroup: 'LESS_THAN_15'}
            , {sex: 'female', beaconKey: '123', userKey: '02', key:'k7', date: 'Tue Jul 05 06:26:59 UTC 2016', freq: 34, preferenceList: ['Movies'], ageGroup: 'BETWEEN_55_65'}
            , {sex: 'female', beaconKey: '121', userKey: '04', key:'k8', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 22, preferenceList: ['Culture'], ageGroup: 'BETWEEN_25_35'}
            , {sex: 'female', beaconKey: '124', userKey: '01', key:'k9', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 115, preferenceList: ['Kids'], ageGroup: 'BETWEEN_35_45'}
            , {sex: 'male', beaconKey: '122', userKey: '02', key:'k10', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 19, preferenceList: [], ageGroup: 'BETWEEN_45_55'}
            , {sex: 'female', beaconKey: '121',userKey: '01', key:'k11', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 24, preferenceList: [], ageGroup: 'BETWEEN_35_45'}
        ];

Can I have an another object from the above json as

var filterObj = {
                sex:[],
                age:[],
                category:[]
            };

and to have a unique values that are occurring in the JSON, Also I have multiple values for preferenceList, that should also be unique in the filterObj.

such like my result should be

filterObj = {
                sex:['male','female'],
                age:['LESS_THAN_15','BETWEEN_25_35','BETWEEN_35_45','BETWEEN_45_55','BETWEEN_55_65'],
                category:['Fashion','Business','Sports','Housing','Jewels','Kids','Movies','Kids']
            };
2
  • You can simply iterate your data array and add to filterObj if it is not already existing Commented Jul 14, 2016 at 8:55
  • Possible duplicate of stackoverflow.com/questions/20739575/… Commented Jul 14, 2016 at 8:57

5 Answers 5

3

You will basically have to iterate over the array data. The best way to find unique values in the array is to use key, value data structure (hash tables), like a Javascript Object.

var sex = {};
var age = {};

data.forEach(function (obj, index) {    
    sex[obj.sex] = index;
    age[obj.age] = index;
});

var filterObj = {};
filterObj['sex'] = Object.keys(sex);
filterObj['age'] = Object.keys(age);
Sign up to request clarification or add additional context in comments.

Comments

2

Make object with unique Key and value pair in javascript

function getMapObject(dataList, key) {
var lookup = {};
for ( var i in dataList) {

    var tempArr = [];
    if (lookup[dataList[i][key]] != undefined) {
        tempArr = lookup[dataList[i][key]];
        tempArr.push(dataList[i]);
        lookup[dataList[i][key]] = tempArr;
    } else {
        tempArr.push(dataList[i]);
        lookup[dataList[i][key]] = tempArr;
    }
}
return lookup;}

Comments

1

try this

var data = [
            {sex: 'male', beaconKey: '121', userKey: '01', key:'k1', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 20, preferenceList: ['Fashion','Business','Sports'], ageGroup: 'LESS_THAN_15'}
            , {sex: 'male', beaconKey: '122', userKey: '01', key:'k2', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 22, preferenceList: ['Business'], ageGroup: 'BETWEEN_25_35'}
            , {sex: 'female', beaconKey: '123', userKey: '01', key:'k3', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 26, preferenceList: ['Housing'], ageGroup: 'BETWEEN_35_45'}
            , {sex: 'male', beaconKey: '121', userKey: '03', key:'k4', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 38, preferenceList: ['Business','Housing','Sports'], ageGroup: 'BETWEEN_25_35'}
            , {sex: 'female', beaconKey: '124', userKey: '03', key:'k5', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 20, preferenceList: ['Business','Housing','Sports'], ageGroup: 'BETWEEN_45_55'}
            , {sex: 'male', beaconKey: '125', userKey: '01', key:'k6', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 42, preferenceList: ['Jewels','Kids'], ageGroup: 'LESS_THAN_15'}
            , {sex: 'female', beaconKey: '123', userKey: '02', key:'k7', date: 'Tue Jul 05 06:26:59 UTC 2016', freq: 34, preferenceList: ['Movies'], ageGroup: 'BETWEEN_55_65'}
            , {sex: 'female', beaconKey: '121', userKey: '04', key:'k8', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 22, preferenceList: ['Culture'], ageGroup: 'BETWEEN_25_35'}
            , {sex: 'female', beaconKey: '124', userKey: '01', key:'k9', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 115, preferenceList: ['Kids'], ageGroup: 'BETWEEN_35_45'}
            , {sex: 'male', beaconKey: '122', userKey: '02', key:'k10', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 19, preferenceList: [], ageGroup: 'BETWEEN_45_55'}
            , {sex: 'female', beaconKey: '121',userKey: '01', key:'k11', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 24, preferenceList: [], ageGroup: 'BETWEEN_35_45'}
        ];

var filterObj = {  sex:[], age:[], category:[] };

//iterate all objects in data
data.forEach( function( obj ){
  //check if value is already there in the array before putting the same in filterObj
  filterObj.sex.indexOf( obj.sex ) == -1 && filterObj.sex.push( obj.sex );
  filterObj.age.indexOf( obj.ageGroup ) == -1 && filterObj.age.push( obj.ageGroup );
  filterObj.category = filterObj.category.concat( obj.preferenceList ) ;
});

//find unique categories
var map = {}; 
filterObj.category.forEach( function(cat){ map[cat] = true }); 
filterObj.category = Object.keys( map );

console.log( filterObj );

Comments

1

You could use an object as hash table for already inserted items to the filtered result.

This proposal uses a map for the wanted properties. It is easy to extend, just add another map name as property and the original property of data as value.

{
    "sex": "sex",
    "age": "ageGroup",
    "category": "preferenceList"
}

var data = [{ sex: 'male', beaconKey: '121', userKey: '01', key: 'k1', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 20, preferenceList: ['Fashion', 'Business', 'Sports'], ageGroup: 'LESS_THAN_15' }, { sex: 'male', beaconKey: '122', userKey: '01', key: 'k2', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 22, preferenceList: ['Business'], ageGroup: 'BETWEEN_25_35' }, { sex: 'female', beaconKey: '123', userKey: '01', key: 'k3', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 26, preferenceList: ['Housing'], ageGroup: 'BETWEEN_35_45' }, { sex: 'male', beaconKey: '121', userKey: '03', key: 'k4', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 38, preferenceList: ['Business', 'Housing', 'Sports'], ageGroup: 'BETWEEN_25_35' }, { sex: 'female', beaconKey: '124', userKey: '03', key: 'k5', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 20, preferenceList: ['Business', 'Housing', 'Sports'], ageGroup: 'BETWEEN_45_55' }, { sex: 'male', beaconKey: '125', userKey: '01', key: 'k6', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 42, preferenceList: ['Jewels', 'Kids'], ageGroup: 'LESS_THAN_15' }, { sex: 'female', beaconKey: '123', userKey: '02', key: 'k7', date: 'Tue Jul 05 06:26:59 UTC 2016', freq: 34, preferenceList: ['Movies'], ageGroup: 'BETWEEN_55_65' }, { sex: 'female', beaconKey: '121', userKey: '04', key: 'k8', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 22, preferenceList: ['Culture'], ageGroup: 'BETWEEN_25_35' }, { sex: 'female', beaconKey: '124', userKey: '01', key: 'k9', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 115, preferenceList: ['Kids'], ageGroup: 'BETWEEN_35_45' }, { sex: 'male', beaconKey: '122', userKey: '02', key: 'k10', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 19, preferenceList: [], ageGroup: 'BETWEEN_45_55' }, { sex: 'female', beaconKey: '121', userKey: '01', key: 'k11', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 24, preferenceList: [], ageGroup: 'BETWEEN_35_45' }],
    map = { sex: 'sex', age: 'ageGroup', category: 'preferenceList' },
    filterObj = {};

data.forEach(function (a) {
    Object.keys(map).forEach(function (k) {
        filterObj[k] = filterObj[k] || [];
        this[k] = this[k] || {};
        (Array.isArray(a[map[k]]) ? a[map[k]] : [a[map[k]]]).forEach(function (b) {
            if (!this[k][b]) {
                this[k][b] = true;
                filterObj[k].push(b);
            }
        }, this);
    }, this);
}, {});

console.log(filterObj);

Comments

0

I recommend you to use lodash library:

var data = [
        {sex: 'male', beaconKey: '121', userKey: '01', key:'k1', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 20, preferenceList: ['Fashion','Business','Sports'], ageGroup: 'LESS_THAN_15'}
        , {sex: 'male', beaconKey: '122', userKey: '01', key:'k2', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 22, preferenceList: ['Business'], ageGroup: 'BETWEEN_25_35'}
        , {sex: 'female', beaconKey: '123', userKey: '01', key:'k3', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 26, preferenceList: ['Housing'], ageGroup: 'BETWEEN_35_45'}
        , {sex: 'male', beaconKey: '121', userKey: '03', key:'k4', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 38, preferenceList: ['Business','Housing','Sports'], ageGroup: 'BETWEEN_25_35'}
        , {sex: 'female', beaconKey: '124', userKey: '03', key:'k5', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 20, preferenceList: ['Business','Housing','Sports'], ageGroup: 'BETWEEN_45_55'}
        , {sex: 'male', beaconKey: '125', userKey: '01', key:'k6', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 42, preferenceList: ['Jewels','Kids'], ageGroup: 'LESS_THAN_15'}
        , {sex: 'female', beaconKey: '123', userKey: '02', key:'k7', date: 'Tue Jul 05 06:26:59 UTC 2016', freq: 34, preferenceList: ['Movies'], ageGroup: 'BETWEEN_55_65'}
        , {sex: 'female', beaconKey: '121', userKey: '04', key:'k8', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 22, preferenceList: ['Culture'], ageGroup: 'BETWEEN_25_35'}
        , {sex: 'female', beaconKey: '124', userKey: '01', key:'k9', date: 'Tue Jul 05 11:59:28 UTC 2016', freq: 115, preferenceList: ['Kids'], ageGroup: 'BETWEEN_35_45'}
        , {sex: 'male', beaconKey: '122', userKey: '02', key:'k10', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 19, preferenceList: [], ageGroup: 'BETWEEN_45_55'}
        , {sex: 'female', beaconKey: '121',userKey: '01', key:'k11', date: 'Wed Jul 06 06:26:59 UTC 2016', freq: 24, preferenceList: [], ageGroup: 'BETWEEN_35_45'}
    ];

var filterObj = {
  sex: _.uniq(_.map(data,'sex')),
  age: _.uniq(_.map(data,'ageGroup')),
  category: _.union.apply(_,_.map(data,'preferenceList'))
};

Here you have the plnkdr:

http://plnkr.co/edit/SStCvyYdSYbmBi8xzX1a?p=preview

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.