J'ai ce tableau d'objets:

var result = [
{
    appAddress:"127.0.0.1",
    name:"AppServer1",
    dbConnection:""
},
{
    appAdress:"",
    name:"DBServer1",
    dbConnection:"Server=.;Database=master;Integrated Security=SSPI"
}];

Maintenant, je dois obtenir uniquement les valeurs de nom (dans un tableau), où appAddress n'est pas vide. J'ai essayé array.filter () et $ .map () mais aucune de ces méthodes ne semble faire ce que je veux.

Voici ce que j'ai essayé:

var appServers = $.map(result, function (val, key) {
    return (key == 'appAddress' && val.length > 0) ? key : null;
    });

Et

var appServers = result.filter(function (entry) {
    return entry['displayName'];
    });
1
Daniel 22 juil. 2015 à 17:22

5 réponses

Meilleure réponse

Pour le filtrage, vous pouvez utiliser les méthodes filter et map de Array. Voir l'exemple ci-dessous.

Array.prototype.filter Docs

Array.prototype.map Docs

var result = [{
  appAdress: "127.0.0.1",
  name: "AppServer1",
  dbConnection: ""
}, {
  appAdress: "",
  name: "DBServer1",
  dbConnection: "Server=.;Database=master;Integrated Security=SSPI"
}];


// First Solution
var out = result.filter(function(obj) {
  return obj.appAdress;
}).map(function(obj) {
  return obj.name;
})

// Second Solution
var namesArr = [];
result.forEach(function(obj) {
  if (obj.appAdress) {
    namesArr.push(obj.name);
  }
});



document.querySelector('#out').innerHTML = JSON.stringify(out, undefined, 4);
document.querySelector('#out2').innerHTML = JSON.stringify(namesArr, undefined, 4);
First Solution
<pre id="out"></pre>

<hr/>

Second Solution
<pre id="out2"></pre>
1
jad-panda 22 juil. 2015 à 14:50

Les objets définis dans votre tableau result ne sont pas valides. Les valeurs des objets sont écrites sous forme de paires name:value (séparées par deux points).

Essaye ça:

var result = [{
  appAdress: "127.0.0.1",
  name: "AppServer1",
  dbConnection: ""
}, {
  appAdress: "",
  name: "DBServer1",
  dbConnection: "Server=.;Database=master;Integrated Security=SSPI"
}];

var resultArr = $.map(result, function(val, i) {
  if (val.appAdress.length > 0) return val.name;
});

console.log(resultArr);
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Exécuter sur JSFiddle ou en savoir plus sur jQuery.map ().

0
Matthias A. Eckhart 22 juil. 2015 à 14:59

Vous pouvez utiliser réduire comme ceci:

var result = [
    {
        appAdress: "127.0.0.1",
        name: "AppServer1",
        dbConnection: ""
    },
    {
        appAdress: "",
        name: "DBServer1",
        dbConnection: "Server=.;Database=master;Integrated Security=SSPI"
    }];

var addresses = result.reduce(function (acc, it) {
    if (it.appAdress) {
        acc.push(it.name);
    }
    return acc;
}, []);

console.log(addresses);
Please check the result in console.
1
marianc 23 juil. 2015 à 22:31

Une chose que vous pourriez probablement faire est

var names = result.filter(
    function (t) {
        return t.appAddress != "";
}).map(
    function (t) {
        return t.name;
});
1
HaloWebMaster 22 juil. 2015 à 19:50

Tout d'abord, vos définitions d'objet sont fausses. Vous devez utiliser : au lieu de =.

Ensuite, vous pouvez le faire avec une simple boucle for:

var output = [];
for (var i = 0; i < result.length; i++) {
    var item = result[i];
    if (item.appAddress) output.push(item.name);
}

Voici un exemple de travail

2
musefan 22 juil. 2015 à 14:35