객체 대신지도 함수 (배열 대신)


1065

나는 물건을 가지고있다 :

myObject = { 'a': 1, 'b': 2, 'c': 3 }

Array.prototype.map다음과 같이 사용되는 것과 유사한 기본 방법을 찾고 있습니다.

newObject = myObject.map(function (value, label) {
    return value * value;
});

// newObject is now { 'a': 1, 'b': 4, 'c': 9 }

JavaScript에는 map객체에 대한 기능이 있습니까? (Node.JS에서 이것을 원하므로 크로스 브라우저 문제는 신경 쓰지 않습니다.)


1
대부분의 답변 Object.keys은 잘 정의 된 순서가 없는를 사용 합니다. 문제가 될 수 있으므로 Object.getOwnPropertyNames대신 사용 하는 것이 좋습니다 .
Oriol

14
JS가이 초보적인 작업을 제공하지 않았다는 것이 놀랍습니다.
jchook

3
@Oriol 확실합니까? MDN이 웹 문서에 따르면, 배열 요소의 순서와 일치 Object.keys하고 Object.getOwnPropertyNames. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Bart

@Bart 순서 Object.keys는 구현에 따라 다릅니다. 참조 stackoverflow.com/a/30919039/1529630
오리올

4
@Oriol 어쨌든 객체의 키 순서에 의존해서는 안되므로 질문과 관련이 없습니다. 그리고 그에게 명령이 중요하다면, 그는 어쨌든 물건을 사용해서는 안됩니다.
BT

답변:


1540

이 네이티브 없다 map받는 Object객체,하지만 어떻게 이것에 대해 :

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

Object.keys(myObject).map(function(key, index) {
  myObject[key] *= 2;
});

console.log(myObject);
// => { 'a': 2, 'b': 4, 'c': 6 }

그러나 다음을 사용하여 쉽게 객체를 반복 할 수 있습니다 for ... in.

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

for (var key in myObject) {
  if (myObject.hasOwnProperty(key)) {
    myObject[key] *= 2;
  }
}

console.log(myObject);
// { 'a': 2, 'b': 4, 'c': 6 }

최신 정보

많은 사람들이 이전 방법이 새 객체를 반환하지 않고 객체 자체에서 작동한다고 언급합니다. 그 문제에 대해 새 객체를 반환하고 원래 객체를 그대로 두는 다른 솔루션을 추가하고 싶었습니다.

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

// returns a new object with the values at each key mapped using mapFn(value)
function objectMap(object, mapFn) {
  return Object.keys(object).reduce(function(result, key) {
    result[key] = mapFn(object[key])
    return result
  }, {})
}

var newObject = objectMap(myObject, function(value) {
  return value * 2
})

console.log(newObject);
// => { 'a': 2, 'b': 4, 'c': 6 }

console.log(myObject);
// => { 'a': 1, 'b': 2, 'c': 3 }

Array.prototype.reduce이전 값을 전류와 약간 병합하여 배열을 단일 값으로 줄입니다. 체인은 빈 객체로 초기화됩니다 {}. 반복 할 때마다 myObject키 값이 두 배로 새 키 가 추가됩니다.

최신 정보

새로운 ES6 기능으로보다 우아한 표현 방법이 objectMap있습니다.

const objectMap = (obj, fn) =>
  Object.fromEntries(
    Object.entries(obj).map(
      ([k, v], i) => [k, fn(v, k, i)]
    )
  )
  
const myObject = { a: 1, b: 2, c: 3 }

console.log(objectMap(myObject, v => 2 * v)) 


3
예, 그런 종류의 문제에 대한 해결책을 권장하지 않습니다. 그렇기 때문에 대안을 더 나은 솔루션으로 업데이트했습니다.
Amberlamps

1
내 대답을 업데이트했습니다. (질문을 다시 읽을 때) OP는 동일한 키를 가진 객체를 원 하고 제공된 기능으로 값이 변경되고 원래 객체는 수정하지 않는 것으로 보입니다 .
Alnitak 2013

13
@ KhalilRavanna 여기에서 코드를 잘못 읽은 것 같습니다.이 답변은 수행하지 map않기 때문에 올바르게 사용 되지 않습니다 return- map마치 forEach전화 인 것처럼 남용 됩니다 . 그는 실제로 경우 return myObject[value] * 2 후 결과가 될 것이다 배열 두 배 원래 값을 포함하는 대신의 목적 , 후자는 분명히 OP가 무엇을 요구되는 두 배 값을 원래의 키를 포함.
Alnitak

3
@Amberlamps .reduce예제는 괜찮지 만 IMHO 는 콜백이 작동 하는 방식과 일치 해야 할뿐만 아니라 어휘 범위에서 사용할 수 있어야하기 때문에 여전히 .mapObjects 의 편의성에 .reduce미치지 못합니다 . 후자는 특히 콜백에서 함수 참조를 전달할 수 없으므로 대신 내부 익명 함수가 필요합니다. .reducemyObject
Alnitak

8
TBH 나는이 답변에 제시 된 두 번째 해결책 만 (또는 원래) 제공 한 답변을 오히려 상향 조정했을 것입니다. 첫 번째는 작동하고 반드시 틀린 것은 아니지만 다른 사람들이 말했듯이지도가 그렇게 사용되는 것을보고 싶지 않습니다. 지도를 볼 때 내 마음은 자동으로 "불변 데이터 구조"를 생각합니다
mjohnsonengr

307

일반 JS ( ES6 / ES2015 ) 에서 즉시 변수를 할당하는 하나의 라이너는 어떻습니까?

사용 만들기 확산 연산자계산 된 키 이름 구문 :

let newObj = Object.assign({}, ...Object.keys(obj).map(k => ({[k]: obj[k] * obj[k]})));

jsbin

reduce를 사용하는 다른 버전 :

let newObj = Object.keys(obj).reduce((p, c) => ({...p, [c]: obj[c] * obj[c]}), {});

jsbin

함수로서의 첫 번째 예 :

const oMap = (o, f) => Object.assign({}, ...Object.keys(o).map(k => ({ [k]: f(o[k]) })));

// To square each value you can call it like this:
let mappedObj = oMap(myObj, (x) => x * x);

jsbin

중첩 된 객체를 매핑 할 경우 재귀 A의 기능적인 스타일, 그것은 다음과 같이 수행 할 수 있습니다 :

const sqrObjRecursive = obj =>
  Object.keys(obj).reduce(
    (newObj, key) =>
      obj[key] && typeof obj[key] === "object"
        ? { ...newObj, [key]: sqrObjRecursive(obj[key]) } // recurse.
        : { ...newObj, [key]: obj[key] * obj[key] }, // square val.
    {}
  );       

jsbin

또는 더 필수적으로 다음과 같이하십시오.

const sqrObjRecursive = obj => {
  Object.keys(obj).forEach(key => {
    if (typeof obj[key] === "object") obj[key] = sqrObjRecursive(obj[key]);
    else obj[key] = obj[key] * obj[key];
  });
  return obj;
};

jsbin

ES7 / ES2016 부터 다음과 같이 Object.entries()대신 사용할 수 있습니다 Object.keys().

let newObj = Object.assign({}, ...Object.entries(obj).map(([k, v]) => ({[k]: v * v})));

ES2019가 도입 Object.fromEntries()되어 더욱 단순화 되었습니다 .

let newObj = Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v * v]));


상속 된 속성과 프로토 타입 체인 :

드문 경우지만 프로토 타입 체인 에서 상속 된 객체의 속성을 보유 하는 클래스와 유사한 객체 를 매핑해야 할 수도 있습니다 . 상속 된 속성을 열거하지 않기 때문에 이러한 경우 에는 작동 하지 않습니다 . 상속 된 속성 을 매핑해야하는 경우을 사용해야합니다 .Object.keys()Object.keys()for (key in myObj) {...}

다음은 다른 객체의 속성을 상속하는 객체의 예 Object.keys()와 이러한 시나리오에서 작동하지 않는 방법 입니다.

const obj1 = { 'a': 1, 'b': 2, 'c': 3}
const obj2 = Object.create(obj1);  // One of multiple ways to inherit an object in JS.

// Here you see how the properties of obj1 sit on the 'prototype' of obj2
console.log(obj2)  // Prints: obj2.__proto__ = { 'a': 1, 'b': 2, 'c': 3}

console.log(Object.keys(obj2));  // Prints: an empty Array.

for (key in obj2) {
  console.log(key);              // Prints: 'a', 'b', 'c'
}

jsbin

그러나 부탁을 들어 주시고 상속을 피하십시오 . :-)


1
Object.keys아름답지만 상속 된 속성을 열거하지 않는다는 사실에 사로 잡혔습니다 . 경고를 추가하는 것이 좋습니다.
David Braun

답을 줄이려면을 사용하십시오 Object.entries({a: 1, b: 2, c: 3}).

1
오타가 있습니다 ( (o, f)논쟁이라고하지만 obj신체에서 사용)
kzahel

4
예, 다음 사람이이 기능의 기능을 알아 내기 위해 몇 분을 보내 게 하시겠습니까? :)
Andrey Popov

1
빈 개체 인 Object.assign(...Object.entries(obj).map(([k, v]) => ({[k]: v * v})))경우 솔루션 이 작동하지 않습니다 obj. 로 변경하십시오 Object.assign({}, ...Object.entries(obj).map(([k, v]) => ({[k]: v * v}))).
blackcatweb

115

기본 메소드는 없지만 lodash # mapValues 는 훌륭하게 작업을 수행합니다.

_.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
// → { 'a': 3, 'b': 6, 'c': 9 }

6
하나의 함수에 대해서만 추가 HTTP 호출과 추가 라이브러리를 추가 할 필요가 없습니다. 어쨌든,이 답변은 구식이며 단순히 Object.entries({a: 1, b: 2, c: 3})배열을 얻기 위해 호출 할 수 있습니다 .

10
왜 배열을 얻는 것이 유용한가요? 맵핑 된 오브젝트에 대한 요구 사항이었습니다. 또한 ES6이 유틸리티 함수 라이브러리를 최근에 어느 정도 사용할 필요가 없었던 것은 꽤 많지만 Lodash를 사용하여 HTTP 호출을 암시하지는 않습니다.
corse32

2
Lodash를 가져 오는 추가 HTTP 호출이라고 생각합니다. 이것이 유일한 유스 케이스라면 과도합니다. 그럼에도 불구하고 Lodash가 널리 보급 된 라이브러리이기 때문에이 답변을 얻는 것이 합리적입니다.
igorsantos07

2
_.map()OP에서 요구하는대로 키를 두 번째 인수로 얻으려면 실제로 사용해야한다는 것은 말할 것도 없습니다 .
igorsantos07

57

하나를 작성하는 것은 매우 쉽습니다.

Object.map = function(o, f, ctx) {
    ctx = ctx || this;
    var result = {};
    Object.keys(o).forEach(function(k) {
        result[k] = f.call(ctx, o[k], k, o); 
    });
    return result;
}

예제 코드 :

> o = { a: 1, b: 2, c: 3 };
> r = Object.map(o, function(v, k, o) {
     return v * v;
  });
> r
{ a : 1, b: 4, c: 9 }

NB :이 버전 this에서는 Array메소드 와 마찬가지로 콜백 의 컨텍스트를 설정 (선택 사항) 할 수도 있습니다 .

EDIT- 객체의 Object.prototype이름이 기존 속성과 충돌하지 않도록의 사용을 제거하도록 변경되었습니다 map.


3
확인. :) 이 질문 에 대한 의견 나를 여기로 데려 왔습니다. 허용 된 답변이 분명히 오용하기 때문에 이것을 +1 할 것입니다 map. 그러나 수정 Object.prototype이 열거 할 수는 없지만 나와 잘 어울리지 않는다고 말해야합니다 .
JLRishe

2
@JLRishe 감사합니다. ES5의 IMHO는 더 이상 다른 방법과의 (이론적) 충돌 위험 을 수정 하지 않는 이유가 더 이상 없습니다Object.prototype . FWIW, 나는 다른 답변이 얼마나 많은 표를 얻었는지 이해할 수 없으며 완전히 잘못되었습니다.
Alnitak

7
@ JLRishe 당신은 오래된 괴짜입니다 ... 시간을 가지고 그 프로토 타입을 수정하십시오!
Nick Manning

12
@NickManning 당신은 젊은 whippersnappers와 당신의 무책임한 행동입니다. 내 마당에서 나가!
JLRishe

3
이것은 이미 작동하지 않습니다 : o = {map: true, image: false}. 당신은 대신 쓰는 대신 위험에o.map(fn)map(o,fn)
처해 있습니다

25

반환 된 키 배열을 사용한 Object.keys다음 사용할 수 있습니다 forEach.

var myObject = { 'a': 1, 'b': 2, 'c': 3 },
    newObject = {};
Object.keys(myObject).forEach(function (key) {
    var value = myObject[key];
    newObject[key] = value * value;
});

또는보다 모듈 방식으로 :

function map(obj, callback) {
    var result = {};
    Object.keys(obj).forEach(function (key) {
        result[key] = callback.call(obj, obj[key], key, obj);
    });
    return result;
}

newObject = map(myObject, function(x) { return x * x; });

Object.keys객체 자체의 열거 가능한 속성 만 포함하는 배열 을 반환하므로 검사가 있는 for..in루프 처럼 동작 hasOwnProperty합니다.


20

이것은 바로 bs이며 JS 커뮤니티의 모든 사람들이 그것을 알고 있습니다. 이 기능 이 있어야 합니다.

const obj1 = {a:4, b:7};
const obj2 = Object.map(obj1, (k,v) => v + 5);

console.log(obj1); // {a:4, b:7}
console.log(obj2); // {a:9, b:12}

다음은 순진한 구현입니다.

Object.map = function(obj, fn, ctx){

    const ret = {};

    for(let k of Object.keys(obj)){
        ret[k] = fn.call(ctx || null, k, obj[k]);
    });

    return ret;
};

항상 직접 구현 해야하는 것은 매우 성가신 일입니다.)

좀 더 정교하고 Object 클래스를 방해하지 않는 것을 원하면 다음을 시도하십시오.

let map = function (obj, fn, ctx) {
  return Object.keys(obj).reduce((a, b) => {
    a[b] = fn.call(ctx || null, b, obj[b]);
    return a;
  }, {});
};


const x = map({a: 2, b: 4}, (k,v) => {
    return v*2;
});

그러나이 맵 함수를 Object에 추가하는 것이 안전합니다. Object.prototype에는 추가하지 마십시오.

Object.map = ... // fairly safe
Object.prototype.map ... // not ok

왜이 함수를 전역 Object객체에 추가 합니까? 그냥 있습니다 const mapObject = (obj, fn) => { [...]; return ret; }.
Amberlamps

7
그것은 : 객체의 메소드해야하기 때문에
알렉산더 밀스

1
만큼 우리는 Object.prototype에 엉망하지 않는 한 우리는 확인을해야
알렉산더 밀스

1
지도가 단지 막연한 모호한 일이라면 틀림 없습니다. 그러나 .map일반적으로 Functor 인터페이스로 이해되며, "Object"에 대한 Functor에 대한 단일 정의는 없습니다. 왜냐하면 자바 스크립트의 거의 모든 것이 매우 독특하고 정의 된 .map 인터페이스 / 로직이있는 것을 포함하여 Object가 될 수 있기 때문입니다.
Dtipson

1
내 생각에 콜백의 첫 번째 주장은 키가 아닌 요소 자체를 반복해야합니다. 예를 들어, 나는 일반적인 map : Object.map ({prop : 1}, el => el)에서 일반적으로 발생하는 동일한 오브젝트를 제공해야한다고 가정하지만 동일한 키 이름 값을 가진 키를 리턴합니다 ...
Gleb Dolzikov

17

객체를 배열에 매핑하기 위해 찾고 답하기 위해 여기에 왔으며 결과적 으로이 페이지를 얻었습니다. 내가 가진 것과 똑같은 답을 찾고 여기 온다면 배열에 매핑하고 객체를 지정하는 방법입니다.

map을 사용하여 객체에서 다음과 같이 새 배열을 반환 할 수 있습니다.

var newObject = Object.keys(myObject).map(function(key) {
   return myObject[key];
});

6
이것은 원격으로 작동하지 않습니다. 새 객체가 아닌 객체 값의 배열 만 반환합니다. 나는 이것이 많은 투표권을 가지고 있다고 믿을 수 없다.
Alnitak

1
맞습니다. 객체와 객체를 매핑하기위한 답변을 찾고 있었기 때문에 질문에 올바르게 대답하지 않습니다. 객체를 배열에 매핑하는 답을 찾고 여기에 왔으며 결과적 으로이 페이지를 얻었습니다. 따라서 내 대답을 남겨두고 그 결과로 여기에 왔을 수있는 사람들을위한 대체 답변임을 반영하도록 편집 할 것입니다 객체를 배열에 매핑합니다.
JoeTron

5
ES7에서 하찮게있을거야Object.values(myObject)
알니 타크

1
알아두면 좋지만 일부 사람들은 여전히 ​​레거시 코드를 사용해야합니다.
JoeTron

const obj = {foo : 'bar', baz : 42}; console.log (Object.entries (obj)); // [[ 'foo', 'bar'], [ 'baz', 42]]
Bashirpour

12

허용되는 답변에는 두 가지 단점이 있습니다.

  • Array.prototype.reduce감소는 복합 유형의 구조를 변경하는 수단을 의미하므로 잘못 사용 됩니다.이 경우에는 발생하지 않습니다.
  • 특히 재사용 할 수 없습니다

ES6 / ES2015 기능적 접근

모든 기능은 카레 형식으로 정의되어 있습니다.

// small, reusable auxiliary functions

const keys = o => Object.keys(o);

const assign = (...o) => Object.assign({}, ...o);

const map = f => xs => xs.map(x => f(x));

const mul = y => x => x * y;

const sqr = x => mul(x) (x);


// the actual map function

const omap = f => o => {
  o = assign(o); // A
  map(x => o[x] = f(o[x])) (keys(o)); // B
  return o;
};


// mock data

const o = {"a":1, "b":2, "c":3};


// and run

console.log(omap(sqr) (o));
console.log(omap(mul(10)) (o));

  • 라인 A o에서 재 할당됩니다. Javascript는 공유 를 통해 참조 값 전달하므로 얕은 사본 o이 생성됩니다. 이제 상위 범위에서 변경하지 않고 o내부 에서 변경할 수 있습니다.omapo
  • B 행 map의 반환 값은 map의 돌연변이를 수행 하기 때문에 무시 o됩니다. 이 부작용 omap은 부모 범위 내에 있고 부모 범위에 표시되지 않으므로 완전히 허용됩니다.

이것은 가장 빠른 솔루션이 아니라 선언적이고 재사용 가능한 솔루션입니다. 다음은 한 줄 간결하고 동일하지만 읽기 쉽지 않은 구현입니다.

const omap = f => o => (o = assign(o), map(x => o[x] = f(o[x])) (keys(o)), o);

부록-왜 객체가 기본적으로 반복되지 않는가?

ES2015는 반복자와 반복 가능한 프로토콜을 지정했습니다. 그러나 객체는 여전히 반복 할 수 없으므로 매핑 할 수 없습니다. 그 이유는 데이터와 프로그램 수준의 혼합 때문입니다 .


1
약간 오버 엔지니어링 된 것 같습니다. 본질적으로 루프가 무엇인지에 대해 6 개의 함수를 계산합니다. 다른 솔루션은 훨씬 간단하며 허용되는 답변도 5 배 더 빠릅니다.
fregante

4
@ bfred.it 귀하의 의견의 목적은 무엇입니까? 미세 최적화를 좋아한다면 Array.prototype.reduce어느 것도 사용해서는 안됩니다 . 내가 여기서 설명하고자하는 것은 받아 들여진 대답이 어떻게 든 "증거" Array.prototype.reduce와 순전히 기능적인 매핑이 구현 될 수 있다는 것입니다. 함수형 프로그래밍에 관심이 없다면 내 대답을 무시하십시오.

2
"복합 유형의 구조를 변경하는 수단을 줄이는 것"나는 그것이 사실이라고 생각하지 않습니다. 정확히 같은 길이 또는 정확히 같은 값의 새 배열을 생성하는 Array.reduce는 완벽하게 합법적입니다. Reduce는 맵 및 / 또는 필터의 기능 (또는 복잡한 변환기에서와 같이 둘 다가 기본이되는 기능)을 다시 만드는 데 사용할 수 있습니다. FP에서는 접는 유형이며 같은 유형으로 끝나는 접는 부분은 여전히 ​​접는 부분입니다.
Dtipson

2
@Dtipson 당신은 절대적으로 맞습니다. A foldmap(functor) 보다 더 일반적 입니다. 그러나 이것은 2016 년 중반의 나의 지식이었습니다. 그것은 영원의 절반이다 : D

1
하 그래. 이 모든 것들이 어떻게 상호 연결되어 있는지, 더 넓은 용어와 인터페이스 생태계를 깨닫는 데 몇 년이 걸렸습니다. 너무 쉬운 것처럼 보이는 것은 불가능한 것으로 밝혀졌으며, 불가능한 것으로 보이는 일부는 매우 깔끔하게 사라졌습니다. :)
Dtipson

10

JavaScript는 새로운 Object.fromEntries방법을 얻었습니다 .

function mapObject (obj, fn) {
  return Object.fromEntries(
    Object
      .entries(obj)
      .map(fn)
  )
}

const myObject = { a: 1, b: 2, c: 3 }
const myNewObject = mapObject(myObject, ([key, value]) => ([key, value * value]))
console.log(myNewObject)

설명

위의 코드는 Object를 중첩 배열 ( [[<key>,<value>], ...]) 로 변환합니다 . Object.fromEntriesArray를 다시 Object로 변환합니다.

이 패턴의 멋진 점은 이제 매핑하는 동안 객체 키를 쉽게 고려할 수 있다는 것입니다.

선적 서류 비치

브라우저 지원

Object.fromEntries는 현재 이러한 브라우저 / 엔진 에서만 지원 되지만 사용 가능한 폴리 필이 있습니다 (예 : @ babel / polyfill ).


2
기본적으로 Object.fromEntries의 반대입니다 Object.entries. Object.entries객체를 키-값 쌍의 목록으로 변환합니다. Object.fromEntries키-값 쌍의 목록을 객체로 변환합니다.
orad

8

최소 버전 (es6) :

Object.entries(obj).reduce((a, [k, v]) => (a[k] = v * v, a), {})

오타 때문에 이것이 잘못되었다고 생각합니다 Object.entries(obj).reduce((a, [k, v]) => [a[k] = v * v, a], {}). 괄호 대신 == , 꺾쇠 괄호 라고 생각합니다 .
Alexander Mills

@AlexanderMills, 내 코드가 정확합니다. 괄호 안의 쉼표 연산자에 대한 자세한 내용은 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…를 참조하십시오.
Yukulélé

다음 번에 설명하고 싶을 수도 있지만, 그 설명이 맞는 것 같습니다.
Alexander Mills

1
기본적으로 내 코드는 다음과 같습니다.Object.entries(obj).reduce((a, [k, v]) => {a[k] = v * v; return a}, {})
Yukulélé

1
좋은 대답입니다. Object.entries().reduce그것이 사용 된 경우 ES6 + .Would와 내가 생각하는 가장 좋은 방법은 더 upvotes을 얻을 것입니다 return보다는 감속기에 문을 implicit return하고 comma이럴 읽기 깔끔한하지만 어려운 - 운영자
Drenai

7

최고의 성능을 위해.

객체가 자주 바뀌지 않지만 자주 반복 해야하는 경우 기본 맵을 캐시로 사용하는 것이 좋습니다.

// example object
var obj = {a: 1, b: 2, c: 'something'};

// caching map
var objMap = new Map(Object.entries(obj));

// fast iteration on Map object
objMap.forEach((item, key) => {
  // do something with an item
  console.log(key, item);
});

Object.entries는 이미 Chrome, Edge, Firefox 및 베타 Opera에서 작동하므로 미래를 보장하는 기능입니다. ES7에서 왔 으므로 작동하지 않는 IE의 경우 https://github.com/es-shims/Object.entries polyfill하십시오 .


Destructing을 사용하는 것은 어떻 습니까?
Константин Ван

1
@ K._ 그것은 매우 느 렸지만 지금은 성능에 대해 모르겠습니다. V8 v 5.6은 구조 조정을위한 최적화를 도입 한 것처럼 보이지만 v8project.blogspot.co.uk
Pawel

또는, 덜 확대됨에 ES7하지만 불변 :const fn = v => v * 2; const newObj = Object.entries(myObject).reduce((acc, [k,v]) => Object.assign({}, acc, {[k]: fn(v)}), {});
mikebridge

왜 다른 답변이 Object.entries를 사용하지 않는지 궁금합니다. 키를 반복하고 obj [key]를 사용하는 것보다 훨씬 깨끗합니다.
corwin.amber

6

당신이 사용할 수있는 map및 방법을 forEach배열에하지만 당신은 그것을 사용하려는 경우 Object당신은 다음과 같은 트위스트와 함께 사용할 수 있습니다 :

자바 스크립트 (ES6) 사용

var obj = { 'a': 2, 'b': 4, 'c': 6 };   
Object.entries(obj).map( v => obj[v[0]] *= v[1] );
console.log(obj); //it will log as {a: 4, b: 16, c: 36}

var obj2 = { 'a': 4, 'b': 8, 'c': 10 };
Object.entries(obj2).forEach( v => obj2[v[0]] *= v[1] );
console.log(obj2); //it will log as {a: 16, b: 64, c: 100}

jQuery 사용

var ob = { 'a': 2, 'b': 4, 'c': 6 };
$.map(ob, function (val, key) {
   ob[key] *= val;
});
console.log(ob) //it will log as {a: 4, b: 16, c: 36}

또는 $.each아래 예제 와 같이 method와 같은 다른 루프를 사용할 수 있습니다 .

$.each(ob,function (key, value) {
  ob[key] *= value;
});
console.log(ob) //it will also log as {a: 4, b: 16, c: 36}

$jquery는 어디에 있습니까 ?
masterxilo

네, $와 jQuery를 모두 사용할 수 있습니다
Haritsinh Gohil

1
@Ronald 나는 오해를 겪었다. 공개를 개선하지는 않았지만 진정으로 내 실수를 인식하고 커뮤니티를 개선해 주셔서 감사합니다.
Haritsinh Gohil

@ bcoughlan 예 그것은 코멘트에 쓴 것과 정확히 일치합니다. 숫자를 제곱하는 것입니다.
Haritsinh Gohil

1
@HaritsinhGohil 나는 그가 jQuery 솔루션을 제공한다고 당신을 비판하고 있음을 의미한다고 생각했습니다. 요즘 jQuery에서 멀어 지도록 자극이 있고, 물론 Node가 있지만 OP가 순수한 JS 또는 Node를 특별히 요구하지 않는 한 누군가 웹 환경에서 작업하고 있다고 가정하는 것이 좋습니다. 거의 사용 가능합니다.
abalter

4

map function존재하지 않지만 Object.prototype그렇게 모방 할 수 있습니다.

var myMap = function ( obj, callback ) {

    var result = {};

    for ( var key in obj ) {
        if ( Object.prototype.hasOwnProperty.call( obj, key ) ) {
            if ( typeof callback === 'function' ) {
                result[ key ] = callback.call( obj, obj[ key ], key, obj );
            }
        }
    }

    return result;

};

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

var newObject = myMap( myObject, function ( value, key ) {
    return value * value;
});

성능 문제 : typeof callback === 'function'절대 중복. 1) map콜백없이 의미가 없습니다. 2) 작동 callback하지 않으면 map구현이 의미없는 for-loop를 실행합니다. 또한 Object.prototype.hasOwnProperty.call( obj, key )약간 과잉입니다.
ankhzet

3

나는 이것을 시도하는 것을 배우려고 Google 검색에서 첫 번째 항목으로 왔으며, 최근에 내가 찾은 솔루션을 찾는 다른 folsk와 공유 할 것이라고 생각했는데, npm 패키지는 불변입니다.

불변이 자체 문서에서 OP의 정확한 상황을 사용하기 때문에 공유하는 것이 재미 있다고 생각합니다. 다음은 내 코드가 아니지만 현재 immutable-js 문서에서 가져온 것입니다.

const { Seq } = require('immutable')
const myObject = { a: 1, b: 2, c: 3 }
Seq(myObject).map(x => x * x).toObject();
// { a: 1, b: 4, c: 9 } 

Seq는 다른 속성을 가지고 있지 않습니다 ( "Seq는 지연 연산을 설명하여 중간 컬렉션을 생성하지 않음으로써 모든 상위 컬렉션 메서드 (예 : 맵 및 필터)을 효율적으로 체인 사용하도록 허용합니다") 및 일부 다른 불변의 JS 데이터가 있음 구조는 또한 작업을 매우 효율적으로 수행 할 수 있습니다.

이 방법을 사용하는 사람은 물론 npm install immutable문서를 읽어야 할 수도 있습니다.

https://facebook.github.io/immutable-js/


3

편집 : 최신 JavaScript 기능을 사용하는 정식 방법은-

const identity = x =>
  x

const omap = (f = identity, o = {}) =>
  Object.fromEntries(
    Object.entries(o).map(([ k, v ]) =>
      [ k, f(v) ]
    )
  )

o일부 객체는 어디에 있으며 f매핑 기능입니다. 또는 from의 함수 a -> b와 type 값을 a가진 객체를 지정하면 type 값을 가진 객체를 생성 할 수 b있습니다. 의사 유형 서명으로-

// omap : (a -> b, { a }) -> { b }

원래의 답변은 강력한 결합기를 보여주기 위해 작성되었으므로 mapReduce변환을 다른 방식으로 생각할 수 있습니다

  1. m, 매핑 기능 – 이전에 들어오는 요소를 변환 할 수있는 기회를 제공합니다.
  2. r, 축소 기능 –이 기능은 누산기를 매핑 된 요소의 결과와 결합합니다.

직관적으로에 mapReduce연결할 수있는 새로운 감속기를 만듭니다 Array.prototype.reduce. 하지만 더 중요한 것은, 우리는 우리의 목적 펑터 구현을 구현할 수있는 omap객체 모노 이드을 이용하여 노골적으로, Object.assign그리고 {}.

const identity = x =>
  x
  
const mapReduce = (m, r) =>
  (a, x) => r (a, m (x))

const omap = (f = identity, o = {}) =>
  Object
    .keys (o)
    .reduce
      ( mapReduce
          ( k => ({ [k]: f (o[k]) })
          , Object.assign
          )
      , {}
      )
          
const square = x =>
  x * x
  
const data =
  { a : 1, b : 2, c : 3 }
  
console .log (omap (square, data))
// { a : 1, b : 4, c : 9 }

실제로 작성해야하는 프로그램의 유일한 부분은 매핑 구현 자체입니다.

k => ({ [k]: f (o[k]) })

알려진 객체 o와 일부 키가 주어지면 객체를 k생성하고 계산 된 속성 kf키 값 을 호출 한 결과입니다 o[k].

우리 mapReduce가 처음 추상화하면 시퀀싱 잠재력을 엿볼 수 있습니다.oreduce

// oreduce : (string * a -> string * b, b, { a }) -> { b }
const oreduce = (f = identity, r = null, o = {}) =>
  Object
    .keys (o)
    .reduce
      ( mapReduce
          ( k => [ k, o[k] ]
          , f
          )
      , r
      )

// omap : (a -> b, {a}) -> {b}
const omap = (f = identity, o = {}) =>
  oreduce
    ( mapReduce
        ( ([ k, v ]) =>
            ({ [k]: f (v) })
        , Object.assign
        )
    , {}
    , o
    )

모든 것이 동일하게 작동하지만 omap더 높은 수준에서 정의 할 수 있습니다. 물론 새로운 Object.entries것은 이것을 바보처럼 보이게하지만 운동은 여전히 ​​학습자에게 중요합니다.

mapReduce여기에서 가능한 모든 잠재력을 볼 수는 없지만 적용 가능한 장소 수를 보는 것이 흥미 롭기 때문에이 답변을 공유합니다. 그것이 파생되는 방법과 그것이 유용 할 수있는 다른 방법에 관심이 있다면, 이 답변을 참조하십시오 .


4
우리가 오히려 사용하자 MapMap.entries확인을 : D를. 평범한 객체를지도 데이터 유형으로 남용하는 데 지쳤습니다.

2
나는 동의 MapD : 상점 객체 곳 / 때 가능하지만, 완전히 일반 JS에이 절차를 사용할 필요를 대체하지 않습니다 사용해야합니다
감사합니다

2

@ Amberlamps 답변을 기반으로 유틸리티 기능이 있습니다.

function mapObject(obj, mapFunc){
    return Object.keys(obj).reduce(function(newObj, value) {
        newObj[value] = mapFunc(obj[value]);
        return newObj;
    }, {});
}

사용은 다음과 같습니다.

var obj = {a:1, b:3, c:5}
function double(x){return x * 2}

var newObj = mapObject(obj, double);
//=>  {a: 2, b: 6, c: 10}

2
var myObject = { 'a': 1, 'b': 2, 'c': 3 };


Object.prototype.map = function(fn){
    var oReturn = {};
    for (sCurObjectPropertyName in this) {
        oReturn[sCurObjectPropertyName] = fn(this[sCurObjectPropertyName], sCurObjectPropertyName);
    }
    return oReturn;
}
Object.defineProperty(Object.prototype,'map',{enumerable:false});





newObject = myObject.map(function (value, label) {
    return value * value;
});


// newObject is now { 'a': 1, 'b': 4, 'c': 9 }

enumerable기본값은false
감사합니다

2

내 답변은 대부분 여기에서 가장 높은 등급의 답변을 기반으로하며 모든 사람들이 이해하기를 바랍니다 (GitHub에 대해서도 동일한 설명이 있음). 이것이 그의 맵에 대한 그의 노력이 작동하는 이유입니다.

Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +    
')');

이 함수의 목적은 배열을 반환하지 않고 모든 객체 (객체 및 배열 모두)에 사용 가능한 방법을 사용하여 객체를 가져 와서 객체의 원래 내용을 수정하는 것입니다. JS 내의 거의 모든 것이 객체이므로, 상속 파이프 라인의 아래 부분에있는 요소는 기술적으로 사용할 수있는 요소를 기술적으로 사용할 수 있습니다.

이것이 작동하는 이유는 .map 함수가 단순히 기존 객체를 수정하는 대신 배열의 명시 적 또는 암시 적 RETURN을 제공해야하는 배열을 반환하기 때문입니다. Object.keys를 사용하여 객체가 배열이라고 생각하도록 기본적으로 프로그램을 속입니다.이 기능을 사용하면 개별 키와 관련된 값 (실제로 배열을 반환했지만 수정했습니다)에 따라 맵 기능을 사용할 수 있습니다. 정상적인 의미로 복귀하지 않는 한 원래 객체를 그대로 사용하여 생성되고 프로그래밍 된대로 수정 된 배열은 없습니다.

이 특정 프로그램은 images라는 객체를 가져와 해당 키의 값을 가져 와서 다른 함수 내에서 사용하기 위해 url 태그를 추가합니다. 오리지널은 이쪽

var images = { 
snow: 'https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305', 
sunny: 'http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-east-   
Matanzas-city- Cuba-20170131-1080.jpg', 
rain: 'https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg' };

... 그리고 수정되었습니다 :

var images = { 
snow: url('https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305'),     
sunny: url('http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-   
east-Matanzas-city- Cuba-20170131-1080.jpg'), 
rain: url('https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg') 
};

개체의 원래 구조는 그대로 유지되며 반환되지 않는 한 정상적인 속성 액세스가 가능합니다. 일반처럼 배열을 반환하지 않으면 모든 것이 정상입니다. 목표는 원래 값 (이미지 [키])을 원하는 것이 아닌 다른 것으로 재지 정하는 것입니다. 내가 아는 한, 배열 출력을 방지하기 위해 이미지 [키]를 다시 할당하고 배열을 반환하기위한 암시 적 또는 명시 적 요청이 없었습니다 (변수 할당 이이 작업을 수행하고 나에게 반짝이고있었습니다).

편집하다:

원래 객체 수정을 피하기 위해 새로운 객체 생성과 관련된 다른 방법을 다룰 것입니다 (그리고 실수로 배열을 출력으로 생성하는 것을 피하기 위해 재 할당이 여전히 필요한 것으로 보입니다). 이 함수는 화살표 구문을 사용하며 나중에 사용하기 위해 단순히 새 객체를 만들려는 경우에 사용됩니다.

const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
                result[key] = mapFn(obj)[key];
                return result;
            }, {});

var newImages = mapper(images, (value) => value);

이러한 기능의 작동 방식은 다음과 같습니다.

mapFn은 나중에 추가 할 함수 (이 경우 (value) => value)를 가져와 mapFn에서 해당 키의 값으로 저장된 값을 반환합니다 (또는 반환 값을 변경 한 경우 2를 곱한 값). obj) [키],

그런 다음 result [key] = mapFn (obj) [key]에서 키와 연관된 원래 값을 재정의합니다.

결과 (.reduce 함수의 끝에서 시작된 괄호 안에있는 누산기)에서 수행 된 작업을 반환합니다.

이 모든 것은 선택된 객체에서 수행되고 있으며 여전히 반환 된 배열에 대한 암시 적 요청을 할 수 없으며 내가 알 수있는 한 값을 다시 할당 할 때만 작동합니다. 이를 위해서는 약간의 정신 체조가 필요하지만 위에서 볼 수 있듯이 필요한 코드 줄이 줄어 듭니다. 출력은 아래에서 볼 수있는 것과 정확히 동일합니다.

{snow: "https://www.trbimg.com/img-5aa059f5/turbine/bs-   
md-weather-20180305", sunny: "http://www.cubaweather.org/images/weather-
photos/lmorning-east-Matanzas-city-Cuba-20170131-1080.jpg", rain: 
"https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg"}

NON-NUMBERS에서 작동했습니다. mapFN 함수에서 값을 간단히 반환하여 모든 객체를 복제 할 수 있습니다.


2

첫 번째 함수는 질문에 대답합니다. 지도를 만듭니다.

두 번째 함수는지도를 만들지 않습니다. 대신을 사용하여 기존 객체의 속성을 반복합니다 hasOwnProperty(). 이지도 대안은 일부 상황에서 더 나은 솔루션 일 수 있습니다.

var myObject = { 'a': 1, 'b': 2, 'c': 3 }


//creates a map (answers question, but function below is 
//much better in some situations)
var newObject = {};
makeMap();    
function makeMap() {
    for (var k in myObject) {
        var value = myObject[k];
        newObject[k] = value * value;
    }
    console.log(newObject); //mapped array
}


//Doesn't create a map, just applies the function to
//a specific property using existing data
function getValue(key) {
  for (var k in myObject) {
    if (myObject.hasOwnProperty(key)) {
      var value = myObject[key]
      return value * value; //stops iteration
    }
  }
}
Input: <input id="input" value="" placeholder="a, b or c"><br>
Output:<input id="output"><br>
<button onclick="output.value=getValue(input.value)" >Get value</button>


2
이것은 원래의 질문에 답하지 않습니다-제공된 함수를 사용하여 값을 새 객체에 매핑하지 않습니다 (즉, Array.prototype.map과 같지 않습니다).
Matt Browne

@MattBrowne 필자는 아마도지도를 만드는 두 번째 방법을 추가했습니다. 속도는 느리지 만 OP가 요청하는 작업을 수행합니다. 첫 번째 방법은 많은 상황에 이상적이므로 루프 및 속성 함수를 사용했습니다.
빅터 스토 다드

1

map값뿐만 아니라 키도 핑에 관심이 있다면 다음 Object.map(valueMapper, keyMapper)과 같이 작동합니다.

var source = { a: 1, b: 2 };
function sum(x) { return x + x }

source.map(sum);            // returns { a: 2, b: 4 }
source.map(undefined, sum); // returns { aa: 1, bb: 2 }
source.map(sum, sum);       // returns { aa: 2, bb: 4 }

3
나는 당신이 기본적으로 답으로 링크를 제공했기 때문에 가정합니다.
Chris Wright

누구에게나 유용한 경우 : npm install @mattisg/object.map.
MattiSG

1

@Amberlamps 및 @yonatanmn 답변을 기반으로 키를 수정할 수있는 버전이 필요했습니다.

var facts = [ // can be an object or array - see jsfiddle below
    {uuid:"asdfasdf",color:"red"},
    {uuid:"sdfgsdfg",color:"green"},
    {uuid:"dfghdfgh",color:"blue"}
];

var factObject = mapObject({}, facts, function(key, item) {
    return [item.uuid, {test:item.color, oldKey:key}];
});

function mapObject(empty, obj, mapFunc){
    return Object.keys(obj).reduce(function(newObj, key) {
        var kvPair = mapFunc(key, obj[key]);
        newObj[kvPair[0]] = kvPair[1];
        return newObj;
    }, empty);
}

factObject =

{
"asdfasdf": {"color":"red","oldKey":"0"},
"sdfgsdfg": {"color":"green","oldKey":"1"},
"dfghdfgh": {"color":"blue","oldKey":"2"}
}

편집 : 시작 객체 {}에 전달하기 위해 약간의 변경. 키가 정수인 경우 [] 일 수 있습니다.


1

특히 단일 객체의 배열에 사용했던 것과 동일한 기능을 사용하고 싶었고 간단하게 유지하고 싶었습니다. 이것은 나를 위해 일했다 :

var mapped = [item].map(myMapFunction).pop();

이것은 다르지 않습니다var mapped = myMapFunction(item)
감사합니다

이것은 내가 본 다른 모든 "로켓 과학"솔루션보다 훨씬 간단합니다. 공유해 주셔서 감사합니다 :)
Yuri Teixeira

1

OP가 요청한 내용에보다 정확하게 대응하기 위해 OP는 다음과 같은 개체를 원합니다.

myObject = { 'a': 1, 'b': 2, 'c': 3 }

지도 메소드 myObject.map를 사용하려면

다음과 같이 사용되는 Array.prototype.map과 유사합니다.

newObject = myObject.map (함수 (값, 레이블) {
    반환 값 * value;
});
// newObject는 이제 { 'a': 1, 'b': 4, 'c': 9}

이럴 최고 ( "에 측면에서 측정 묻는 것과 가까운 대답이 될 것"+ "는 더 ES {5,6,7}이 불필요하게 필요하지 않습니다") :

myObject.map = function mapForObject(callback)
{
  var result = {};
  for(var property in this){
    if(this.hasOwnProperty(property) && property != "map"){
      result[property] = callback(this[property],property,this);
    }
  }
  return result;
}

위의 코드는 의도적으로 최신 ECMAScript 버전에서만 사용 가능한 언어 기능을 사용하지 않습니다. 위의 코드를 사용하면 다음과 같이 문제를 해결할 수 있습니다.

myObject = { 'a': 1, 'b': 2, 'c': 3 };

myObject.map = function mapForObject(callback)
{
  var result = {};
  for(var property in this){
    if(this.hasOwnProperty(property) && property != "map"){
      result[property] = callback(this[property],property,this);
    }
  }
  return result;
}

newObject = myObject.map(function (value, label) {
  return value * value;
});
console.log("newObject is now",newObject);
대체 테스트 코드는 여기

일부 사람들은 눈살을 찌푸리게 할뿐만 아니라, 이와 같이 프로토 타입 체인에 솔루션을 삽입 할 수도 있습니다.

Object.prototype.map = function(callback)
{
  var result = {};
  for(var property in this){
    if(this.hasOwnProperty(property)){
      result[property] = callback(this[property],property,this);
    }
  }
  return result;
}

주의 깊게 감독 할 때 어떤 영향도 미치지 않아야 map하며 다른 객체의 방법 (예 : Array 's map)에 영향을 미치지 않아야 합니다.



1

함수 mapEntries를 정의하십시오.

mapEntries는 매개 변수 값, 키 및 객체와 함께 객체의 각 항목에서 호출되는 콜백 함수를 사용합니다. 새로운 값을 반환해야합니다.

mapEntries는 콜백에서 반환 된 새 값으로 새 객체를 반환해야합니다.

Object.defineProperty(Object.prototype, 'mapEntries', {
  enumerable: false,
  value: function (mapEntriesCallback) {
    return Object.fromEntries(
      Object.entries(this).map(
        ([key, value]) => [key, mapEntriesCallback(value, key, this)]
      )
    )
  }
})


// Usage example:

var object = {a: 1, b: 2, c: 3}
var newObject = object.mapEntries(value => value * value)
console.log(newObject)
//> {a: 1, b: 4, c: 9}

편집 : 이전 버전에서는 열거 가능한 속성이 아니라고 지정하지 않았습니다.


0

그는 도움이 될만한 작은 매퍼 함수를 ​​작성했습니다.

    function propertyMapper(object, src){
         for (var property in object) {   
           for (var sourceProp in src) {
               if(property === sourceProp){
                 if(Object.prototype.toString.call( property ) === '[object Array]'){
                   propertyMapper(object[property], src[sourceProp]);
                   }else{
                   object[property] = src[sourceProp];
                }
              }
            }
         }
      }

1
"Hey"대신 "I"를 의미 한 것 같습니다
Carlo

0

또 다른 방법은 깊은 객체에서도 작동 할 수있는 사용자 정의 json stringify 함수를 사용하는 것입니다. 어쨌든 json으로 서버에 게시하려는 경우 유용 할 수 있습니다

const obj = { 'a': 1, 'b': 2, x: {'c': 3 }}
const json = JSON.stringify(obj, (k, v) => typeof v === 'number' ? v * v : v)

console.log(json)
console.log('back to json:', JSON.parse(json))


0

면제를 줄이기 위해 문자열 만 처리합니다.

Object.keys(params).map(k => typeof params[k] == "string" ? params[k] = params[k].trim() : null);

0

TypeScript의 객체 매퍼

내가 사용하는 예처럼 Object.fromEntries같은 이 하나 ,하지만 여전히 그들이 매우 쉽게 사용할 수 없습니다. 를 사용한 Object.keys다음 조회하는 답변 key은 실제로 필요하지 않은 여러 조회를 수행하고 있습니다.

나는이 였으면 Object.map기능을하지만, 우리는 자신의 우리를 만들고 호출 할 수 있습니다 objectMap모두 수정할 수있는 기능 keyvalue:

사용법 (자바 스크립트) :

const myObject = { 'a': 1, 'b': 2, 'c': 3 };

// keep the key and modify the value
let obj = objectMap(myObject, val => val * 2);
// obj = { a: 2, b: 4, c: 6 }


// modify both key and value
obj = objectMap(myObject,
    val => val * 2 + '',
    key => (key + key).toUpperCase());
// obj = { AA: '2', BB: '4', CC: '6' }

코드 (TypeScript) :

interface Dictionary<T> {
    [key: string]: T;
}

function objectMap<TValue, TResult>(
    obj: Dictionary<TValue>,
    valSelector: (val: TValue, obj: Dictionary<TValue>) => TResult,
    keySelector?: (key: string, obj: Dictionary<TValue>) => string,
    ctx?: Dictionary<TValue>
) {
    const ret = {} as Dictionary<TResult>;
    for (const key of Object.keys(obj)) {
        const retKey = keySelector
            ? keySelector.call(ctx || null, key, obj)
            : key;
        const retVal = valSelector.call(ctx || null, obj[key], obj);
        ret[retKey] = retVal;
    }
    return ret;
}

TypeScript를 사용하지 않는 경우 TypeScript Playground 에서 위의 코드를 복사 하여 JavaScript 코드를 얻으십시오.

또한, 내가 넣어 이유 keySelector후에 valSelector는 선택 사항이기 때문에 매개 변수 목록이다.

* 일부 크레딧은 alexander-mills의 답변으로 이동합니다 .


0
const mapObject = (targetObject, callbackFn) => {
    if (!targetObject) return targetObject;
    if (Array.isArray(targetObject)){
        return targetObject.map((v)=>mapObject(v, callbackFn))
    }
    return Object.entries(targetObject).reduce((acc,[key, value]) => {
        const res = callbackFn(key, value);
        if (!Array.isArray(res) && typeof res ==='object'){
            return {...acc, [key]: mapObject(res, callbackFn)}
        }
        if (Array.isArray(res)){
            return {...acc, [key]: res.map((v)=>mapObject(v, callbackFn))}
        }
        return {...acc, [key]: res};
    },{})
};
const mapped = mapObject(a,(key,value)=> {
    if (!Array.isArray(value) && key === 'a') return ;
    if (!Array.isArray(value) && key === 'e') return [];
    if (!Array.isArray(value) && key === 'g') return value * value;
    return value;
});
console.log(JSON.stringify(mapped)); 
// {"b":2,"c":[{"d":2,"e":[],"f":[{"g":4}]}]}

이 함수는 객체와 객체의 배열을 재귀 적으로 수행합니다. 정의되지 않은 상태로 반환되면 속성을 삭제할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.