[javascript] 객체 배열의 값에 대해 .join 수행

문자열 배열이 있으면 .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(', ')