2015-07-22 3 views
1

У меня есть этот массив объектов:фильтра JavaScript Object значения

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

Теперь мне нужно получить только значение имен (в массив), где appAddress не пусто. Я пробовал array.filter() и $ .map(), но ни один из этих методов не делает то, что я хочу.

Это то, что я пробовал:

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

и

var appServers = result.filter(function (entry) { 
    return entry['displayName']; 
    }); 
+0

Просто массив строк. –

+3

Покажите, что вы пробовали. И это довольно простая задача для себя. Просто зациклируйте массив, проверьте «appAddress», если он НЕ пуст, «нажмите» его на новый массив, содержащий результаты. – musefan

+2

Что вы пробовали? Что случилось? '.filter()' и '.map()' именно то, что вам нужно. – SLaks

ответ

1

Для фильтрации можно использовать filter и map методы Array. См. Приведенный ниже пример.

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>

+0

@musefan см. Обновленную реализацию. Я добавил карту после фильтра. –

+0

Это (первое решение) работало для меня. Сначала мне нужно отфильтровать, а затем отобразить одно значение объекта. Благодаря! –

1

Одна вещь, которую вы могли бы, вероятно, сделать это

var names = result.filter(
    function (t) { 
     return t.appAddress != ""; 
}).map(
    function (t) { 
     return t.name; 
}); 
+0

Пропустил эту часть вопроса X.X обновил мой ответ. – HaloWebMaster

+0

Лучше отформатировать свой ответ в виде кода (4 пробела), а что цитата (>) – musefan

0

объекты, определенные в вашем result массиве не являются действительными. Значения объектов записываются как name:value пар (разделенных двоеточием).

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

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>

Выполнить на JSFiddle или узнать больше о jQuery.map().

1

Вы можете использовать уменьшить так:

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.

+0

Я продолжаю забывать о сокращении +1 – epascarello

2

Во-первых, ваши определения объектов неверны. Вы должны использовать : вместо =.

Далее, вы можете сделать это с простой цикл:

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

Here is a working example

Смежные вопросы