Как добавить свойство к свойству объекта на основе условия в JavaScript? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть 2 массива, как показано ниже:

arr = [
  { "zc": 33004, "score": 32.61 },
  { "zc": 33005, "score": 88.51 },
  ...
]

arr2 = [
  "type": "feature", properties: { "zc": 33004 }, geometry: { ... },
  "type": "feature", properties: { "zc": 33005}, geometry: { ... }, 
  "type": "feature", properties: { "zc": 33009}, geometry: { ... }
]

expected result = [
  "type": "feature", properties: { "zc": 33004, "score": 32.61 }, geometry: { ... },
  "type": "feature", properties: { "zc": 33005, "score": 88.51 }, geometry: { ... }, 
  "type": "feature", properties: { "zc": 33009, "score": 0 }, geometry: { ... }
]

Здесь я хочу добавить score из первого массива, если второй массив zc сопоставлен внутри properties объекта в каждом массиве объектов.

пишу фрагмент кода с использованием оператора распространения, как показано ниже

  arr.forEach(ele => {
      arr2.forEach(element => {
        element = {
          ...element,
          ...((ele.zipcode==element.properties.zipcode) ? {element.properties.scope: ele.zipcode} : {element.properties.scope: 0})
        }
      });
    }) 
  console.log(arr2);

но я получаю ошибку во время компиляции. где я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы получаете ошибку компиляции, потому что вы не можете использовать точку внутри имени свойства объекта (например, { element.properties.scope: ... }). Поэтому вы должны сделать это следующим образом:

arr.forEach(arrElem =>
  arr2.forEach(arr2Elem =>
    arr2Elem.properties = {
      ...arr2Elem.properties,
      ...{
        score: arrElem.zipcode === arr2Elem.properties.zipcode ? arrElem.score : 0
      }
    }
  );
);

console.log(arr2);

Но я думаю, что это не правильный способ сделать это. Я думаю, что вы должны использовать find(), как показано ниже:

arr2.forEach(arr2Elem =>
  arr2Elem.properties = {
    ...arr2Elem.properties,
    ...{
      score: (arr.find(arrElem => arrElem.zipcode === arr2Elem.properties.zipcode) || { score: 0 }).score
    }
  }
);

console.log(arr2);

(я не изменяю arr2Elem напрямую, но меняю его свойство properties, поскольку оператор распространения не может использоваться с подобъектами).

0 голосов
/ 28 июня 2018

Вы можете создать временный объект для arr, используя reduce. Используйте zc в качестве ключа и score в качестве значения. Это облегчит проверку, если zc существует.

Используйте map для цикла arr2

let arr = [{"zc":33004,"score":32.61},{"zc":33005,"score":88.51}]
let arr2 = [{"type":"feature","properties":{"zc":33004},"geometry":{}},{"type":"feature","properties":{"zc":33005},"geometry":{}},{"type":"feature","properties":{"zc":33009},"geometry":{}}]

let tempArr = arr.reduce((c, v) => Object.assign(c, {[v.zc]: v.score}), {})

let result = arr2.map(o => {
  o = {...o}  //shallow copy the object
  o.properties = {...o.properties,score: tempArr[o.properties.zc] || 0}
  return o;
})

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...