Объединение массивов JSON - PullRequest
2 голосов
/ 12 мая 2010

У меня есть 3 массива json, каждый с информацией, перечисленной в том же формате:

Array:
    ID:
    NAME:
    DATA:

    ID:
    NAME:
    DATA:

    etc...

Моя цель - объединить все 3 массива в один массив, отсортировать и отобразить по ИМЯ, передав 3 массива в функцию.

Я попробовал функцию:

Javascript Call:

// to save time I'm just passing the name of the array, I've tried passing
// the full array name as json[0]['DATA'][array_1][0]['NAME'] as well.

combineNames(['array_1','array_2']);

ФУНКЦИЯ:

function combineNames(names) {

    var allNames = []

    for (i=0;i<names.length;i++) {
        for (j=0;j<json[0]['DATA'][names[i]].length;j++) {
            allNames.push(json[0]['DATA'][names[i]][j]['NAME']);
        }
    }

    return allNames.sort();
}

Выше приведено сообщение об ошибке, что NAME имеет значение null или не определено.

Я также пытался использовать функцию array.concat, которая работает, когда я жестко ее кодирую:

var names = [];
var allNames = [];

var names = names.concat(json[0]['DATA']['array_1'],json[0]['DATA']['array_2']);

for (i=0;i<names.length;i++) {
    allNames.push(names[i]['NAME']);
}

return allNames.sort();

Но я не могу понять, как передать массивы в функцию (и, если возможно, я хотел бы просто передать часть имени массива вместо всего json [0] ['DATA'] ['array_name '] Как я пытался сделать в первой функции ...

Ответы [ 4 ]

9 голосов
/ 13 мая 2010

Вы можете легко комбинировать JSON с jQuery :

var x ={ a:1, b:2 };
var y ={ a:2, c:3 };
var z ={ b:3, d:4 };

$.extend(x, y, z);

console.dir(x); // now 'x' is all of them combined
4 голосов
/ 13 мая 2010

Если у вас есть 3 массива, как это:

[{ "id":1, "name":"Bob", "data":1},{ "id":2, "name":"Fred", "data":2 }]

Просто сделайте:

function combine() {
    var ar = [];

    return ar.concat.apply(ar, arguments).sort(function (a, b) {
        var aName = a.NAME;
        var bName = b.NAME;
        if (aName < bName) {
            return -1;
        } else if (aName == bName) {
            return 0;
        } else {
            return 1;
        };
    });
};

Тогда назовите это как:

var jointArrays = combine(array1, array2, array3, ...);

Однако, если ваш JSON выглядит так:

json[0]['DATA'][array_1]
json[0]['DATA'][array_2]
json[0]['DATA'][array_3]

Вы можете просто определить combine() следующим образом, что будет удобнее:

function combine(arrays) {
    var ar = [];

    return ar.concat.apply(ar, arrays).sort(function (a, b) {
        var aName = a.NAME;
        var bName = b.NAME;
        if (aName < bName) {
            return -1;
        } else if (aName == bName) {
            return 0;
        } else {
            return 1;
        };
    });
};

Тогда назовите это как:

var jointArrays = combine(json[0].DATA);

Если вам нужен массив только имен, а не объектов, используйте следующее:

function combine(arrays) {
    var ar = [],
        ret = [];

    ar = ar.concat.apply(ar, arrays);

    for (var i=0;i<ar.length;i++) {
        ret.push(ar.NAME);
    };

    return ret.sort();
};

Javascript чувствителен к регистру; убедитесь, что это DATA, а не data, а NAME и не name.

Теперь немного по хозяйству.

В вашем примере обе ваши переменные-счетчики объявляются как "подразумеваемые глобальные переменные", потому что вы не ставите перед ними префикс var ( и подразумеваемые глобальные значения неверны ). Вы должны использовать:

for (var i=0;i<something.length;i++) {
   //
};

Вместо пренебрежения var.

Также "{}" создает объект. «[]» создает массив. Javascript не поддерживает ассоциативный массив; например, массив с ключами, которые являются чем угодно, кроме числа. То, что вы возвращаете в JSON, это массив объектов

«Квадратная запись» и «точечная запись» являются взаимозаменяемыми. object["one"] эквивалентно object.one

Квадратная запись обычно используется, когда ключ хранится как переменная или когда вы обращаетесь к массиву.

var key = "one";
object[key]

Надеюсь, это поможет.

0 голосов
/ 13 мая 2010
function allNames(names) {

var allNames = [];

for (var i=0;i<names.length;i++) {
    for (var j=0;j<json[0]['DATA'][names[i]].length;j++) {
        allNames.push(json[0]['DATA'][names[i]][j]['NAME']);
    }
}

return allNames.sort();

}

вызывается с помощью:

allNames(['array_1','array_2']);

Кажется, работает.

0 голосов
/ 12 мая 2010

Вы переделываете переменную allNames, очищаете ее.

Попробуйте это:

function combineNames(names) {
var allNames = [];
var data = json[0]['DATA'];
for (arrnames in data) {
    for (j=0;j<data[arrnames].length;j++) {
        if ('NAME' in data[arrnames]){
          allNames.push(data[arrnames]['NAME']);
        }
    }
}
return allNames.sort();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...