Node.js + objectArray [英] Node.js + objectArray

查看:84
本文介绍了Node.js + objectArray的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的节点应用程序中,我必须从另一个对象数组构造一个对象数组。

In my node app i have to construct an object array from another object array.

将我的对象数组视为......

Consider my object array as...

 levels: [
{
country_id: 356,
country_name: "aaa",
level0: "bbbb",
level1: "cccc",
level2: "dddd",
level3: "eeee",
level4: "fffff"
},
{
country_id: 356,
country_name: "aaaa",
level0: "bbbb",
level1: "cccc",
level2: "dddd",
level3: "eeee",
level4: "gggg"-----------> here is the differnce..
}
]

如果是相同的id任何上面的1是不同的我必须使它成为一个数组,应该是1 id的单个条目。

If for same id any 1 of the above is different i have to make it an array and should be single entry for 1 id.

所以我想要的是:

 levels: [
    "356":{        
    country_name: "aaa",
    level0: "bbbb",
    level1: "cccc",
    level2: "dddd",
    level3: "eeee",
    level4: ["fffff","gggg"]
    }]

但是我无法正确地做到这一点。请帮我解决这个问题。谢谢你提前。

But i cant get the right way to do it.Please help me to solve this.Thanks in advance.

推荐答案

注意:请注意,此程序假设只有两次重复等级。

Note: Please note that, this program assumes that there are only two repetitions in the levels.

var obj = {
    levels: [{
        country_id: 356,
        country_name: "aaa",
        level0: "bbbb",
        level1: "cccc",
        level2: "dddd",
        level3: "eeee",
        level4: "fffff"
    }, {
        country_id: 356,
        country_name: "aaa",
        level0: "bbbb",
        level1: "cccc",
        level2: "dddd",
        level3: "eeee",
        level4: "gggg"
    }]
};

obj.levels = obj.levels.reduce(function(result, current) {
    result[current.country_id] = result[current.country_id] || {};
    var temp_result = result[current.country_id];
    for (var key in current) {
        if (temp_result.hasOwnProperty(key) === false) {
            temp_result[key] = current[key];
        } else if (temp_result[key] !== current[key]) {
            temp_result[key] = [temp_result[key], current[key]];
        }
    }
    return result;
}, {})

console.log(obj);

输出

{ levels: 
   { '356': 
      { country_id: 356,
        country_name: 'aaa',
        level0: 'bbbb',
        level1: 'cccc',
        level2: 'dddd',
        level3: 'eeee',
        level4: ['fffff', 'gggg'] } } }

这是一个通用解决方案,

And this is a generic solution,

obj.levels = obj.levels.reduce(function(result, current) {
    result[current.country_id] = result[current.country_id] || {};
    var temp_result = result[current.country_id],
        toString = Object.prototype.toString;
    for (var key in current) {
        if (temp_result.hasOwnProperty(key) === false) {
            temp_result[key] = current[key];
        } else if (toString.call(temp_result[key]) === "[object Array]") {
            if (temp_result[key].every(function(currentItem) {
                return currentItem !== current[key];
            })) {
                temp_result[key].push(current[key]);
            }
        } else if (temp_result[key] !== current[key]) {
            temp_result[key] = [temp_result[key], current[key]];
        }
    }
    return result;
}, {});

这篇关于Node.js + objectArray的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆