문자열 배열이 있으면 .join()
메서드를 사용하여 각 요소를 쉼표로 구분하여 단일 문자열을 얻을 수 있습니다 .
["Joe", "Kevin", "Peter"].join(", ") // => "Joe, Kevin, Peter"
객체 배열이 있고 그 안에 보유 된 값에 대해 유사한 작업을 수행하고 싶습니다. 그래서
[
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
]
이전과 동일한 출력을 얻으려면 속성 join
에 대해서만 메소드를 수행하십시오 name
.
현재 다음 기능이 있습니다.
function joinObj(a, attr){
var out = [];
for (var i = 0; i < a.length; i++){
out.push(a[i][attr]);
}
return out.join(", ");
}
해당 코드에는 아무런 문제가 없지만 작동하지만 갑자기 간단한 간결한 코드 줄에서 매우 필수적인 기능으로 전환했습니다. 이것을 간결하고 이상적으로 더 기능적으로 작성하는 방법이 있습니까?
답변
객체를 무언가 (이 경우 속성)에 매핑하려는 경우. Array.prototype.map
기능적으로 코딩하려면 원하는 것이 있다고 생각 합니다.
[
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
].map(function(elem){
return elem.name;
}).join(",");
현대 JavaScript에서 :
[
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
].map(e => e.name).join(",");
ES5와 호환 되지 않는 이전 브라우저를 지원하려는 경우 이를 숨길 수 있습니다 (위의 MDN 페이지에 폴리 필이 있음). 또 다른 대안은 underscorejs의 pluck
방법 을 사용하는 것입니다 .
var users = [
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
];
var result = _.pluck(users,'name').join(",")
답변
글쎄 당신은 항상 toString
객체 의 메소드를 무시할 수 있습니다 :
var arr = [
{name: "Joe", age: 22, toString: function(){return this.name;}},
{name: "Kevin", age: 24, toString: function(){return this.name;}},
{name: "Peter", age: 21, toString: function(){return this.name;}}
];
var result = arr.join(", ");
//result = "Joe, Kevin, Peter"
답변
나는 또한 reduce
방법 을 사용하여 왔는데 , 이것은 다음과 같습니다.
[
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
].reduce(function (a, b) {return (a.name || a) + ", " + b.name})
는 (a.name || a)
첫번째 요소가 올바르게 처리되지만, 나머지는 (여기서 그렇다 a
문자열이기 때문에 a.name
대상으로 취급되지 정의되지 않는다).
편집 : 나는 이제 이것을 더 리팩토링했습니다.
x.reduce(function(a, b) {return a + ["", ", "][+!!a.length] + b.name;}, "");
a
항상 문자열 처럼 깨끗하고 항상 b
객체입니다 (의 선택적 initialValue 매개 변수 를 사용하기 때문에 reduce
)
6 개월 후 편집 : 오, 내가 생각한 것. “청소기”. 나는 코드 신들을 화나게했다.
답변
외부 라이브러리를 사용하지 않고 쉽게 할 수있는 방법이 있는지 모르겠지만 개인적 으로 배열, 컬렉션 등을 처리하기위한 수많은 유틸리티가있는 underscore.js 를 좋아 합니다 .
밑줄을 사용하면 한 줄의 코드로 쉽게 할 수 있습니다.
_.pluck(arr, 'name').join(', ')
답변
노드 또는 ES6 +에서 :
users.map(u => u.name).join(', ')
답변
객체 배열이 변수에 의해 참조된다고 말할 수 있습니다. users
ES6을 사용할 수 있다면 가장 쉬운 해결책은 다음과 같습니다.
users.map(user => user.name).join(', ');
그렇지 않은 경우 lodash를 사용할 수 있습니다.
_.map(users, function(user) {
return user.name;
}).join(', ');
답변
객체 및 동적 키인 경우 : "applications\":{\"1\":\"Element1\",\"2\":\"Element2\"}
Object.keys(myObject).map(function (key, index) {
return myObject[key]
}).join(', ')