Перепутан с фильтром json внутри цикла for

#javascript

#javascript

Вопрос:

Я пишу код, который должен сравнить 2 массива json и создать новый массив. data это основной массив, который используется для сравнения, nData это 2-й массив json, в котором мы сравниваем значения. вот критерии.

  • Если nData идентификатор равен s data knowledge__c , создайте новый ключ (именованный icon ) и значение как bin
  • В противном случае создайте новый ключ (именованный icon ) и значение as non bin .

Вот мой код

 var data = [{
  "Id": "a8109000000CcktAAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oq3ZAAQ",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000Ccl4AAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oiqdAAA",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000Ccm1AAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000orsBAAQ",
  "ResearchState__c": "In verification"
}, {
  "Id": "a8109000000CcNFAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oipoAAA",
  "ResearchState__c": "Confirmed Partial Solution"
}, {
  "Id": "a8109000000CcNZAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000onvHAAQ",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000CcNPAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000olFxAAI",
  "ResearchState__c": "In verification"
}];

var nData = [{
  "Id": "ka109000000ors1AAA"
}, {
  "Id": "ka109000000oq3ZAAQ"
}, {
  "Id": "ka109000000oiqdAAA"
}, {
  "Id": "ka109000000oiqDAAQ"
}, {
  "Id": "ka109000000oir9AAA"
}, {
  "Id": "ka109000000oiqCAAQ"
}];

var articleList = [];
let myArticle = {};
for (let article of nData) {
  myArticle = article;
  var newA = data.filter((item) => {
    if (item.Knowledge__c == article.Id)
      myArticle.icon = 'Non bin';
    else
      myArticle.icon = 'bin';
  });

  articleList.push(myArticle);

}

console.log(articleList); 

В моем текущем коде он добавляется bin ко всем объектам. т.е. else Часть запускается.

Пожалуйста, дайте мне знать, где я ошибаюсь и как это исправить.

Спасибо

Комментарии:

1. должны ли data и ndata быть одинаковой длины?

2. Это массивы объектов, а не JSON. .filter() это неправильный метод для использования, он предназначен, ну, для фильтрации элементов из массива. Вместо этого вам нужен .some() or .find() .

3. нет @richytong, они могут различаться. они являются результатами некоторого поискового запроса в моей системе

4. @GuyIncognito в чем разница между find() и some() ?

5. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… и developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Ответ №1:

Я полагаю, вы искали some метод, а не filter такой:

 var data = [{
  "Id": "a8109000000CcktAAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oq3ZAAQ",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000Ccl4AAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oiqdAAA",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000Ccm1AAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000orsBAAQ",
  "ResearchState__c": "In verification"
}, {
  "Id": "a8109000000CcNFAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oipoAAA",
  "ResearchState__c": "Confirmed Partial Solution"
}, {
  "Id": "a8109000000CcNZAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000onvHAAQ",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000CcNPAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000olFxAAI",
  "ResearchState__c": "In verification"
}];

var nData = [{
  "Id": "ka109000000ors1AAA"
}, {
  "Id": "ka109000000oq3ZAAQ"
}, {
  "Id": "ka109000000oiqdAAA"
}, {
  "Id": "ka109000000oiqDAAQ"
}, {
  "Id": "ka109000000oir9AAA"
}, {
  "Id": "ka109000000oiqCAAQ"
}];

var articleList = [];
let myArticle = {};
for (let article of nData) {
  myArticle = article;
  if(data.some((item) => item.Knowledge__c == article.Id)){
      myArticle.icon = 'Non bin';
   } else{
      myArticle.icon = 'bin';
  }

  articleList.push(myArticle);

}

console.log(articleList); 

С some помощью метода я проверяю, есть ли Knowledge__c в data массиве объекты с объектами Id from nData

Комментарии:

1. Привет @Ran Marciano. Извините за мое невежество, в чем разница между some и find ?

2. @user3872094 find возвращает значение первого элемента в массиве, который удовлетворяет условию функции, в то время some как возвращает логическое значение, проверяя, удовлетворяет ли какой-либо элемент условию.

Ответ №2:

 var data = [
  {
    Id: 'a8109000000CcktAAC',
    DiagBinder__c: 'a8009000000boTeAAI',
    Knowledge__c: 'ka109000000oq3ZAAQ',
    ResearchState__c: 'Not verified'
  },
  {
    Id: 'a8109000000Ccl4AAC',
    DiagBinder__c: 'a8009000000boTeAAI',
    Knowledge__c: 'ka109000000oiqdAAA',
    ResearchState__c: 'Not verified'
  },
  {
    Id: 'a8109000000Ccm1AAC',
    DiagBinder__c: 'a8009000000boTeAAI',
    Knowledge__c: 'ka109000000orsBAAQ',
    ResearchState__c: 'In verification'
  },
  {
    Id: 'a8109000000CcNFAA0',
    DiagBinder__c: 'a8009000000boTeAAI',
    Knowledge__c: 'ka109000000oipoAAA',
    ResearchState__c: 'Confirmed Partial Solution'
  },
  {
    Id: 'a8109000000CcNZAA0',
    DiagBinder__c: 'a8009000000boTeAAI',
    Knowledge__c: 'ka109000000onvHAAQ',
    ResearchState__c: 'Not verified'
  },
  {
    Id: 'a8109000000CcNPAA0',
    DiagBinder__c: 'a8009000000boTeAAI',
    Knowledge__c: 'ka109000000olFxAAI',
    ResearchState__c: 'In verification'
  }
];

var nData = [
  {
    Id: 'ka109000000ors1AAA'
  },
  {
    Id: 'ka109000000oq3ZAAQ'
  },
  {
    Id: 'ka109000000oiqdAAA'
  },
  {
    Id: 'ka109000000oiqDAAQ'
  },
  {
    Id: 'ka109000000oir9AAA'
  },
  {
    Id: 'ka109000000oiqCAAQ'
  }
];

const articleList = nData.map((item) => ({
  ...item,
  icon: data.some((dt) => dt.Knowledge__c === item.Id) ? 'bin' : 'non bin'
}));

console.log(articleList); 

Ответ №3:

 var data = [{
  "Id": "a8109000000CcktAAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oq3ZAAQ",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000Ccl4AAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oiqdAAA",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000Ccm1AAC",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000orsBAAQ",
  "ResearchState__c": "In verification"
}, {
  "Id": "a8109000000CcNFAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000oipoAAA",
  "ResearchState__c": "Confirmed Partial Solution"
}, {
  "Id": "a8109000000CcNZAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000onvHAAQ",
  "ResearchState__c": "Not verified"
}, {
  "Id": "a8109000000CcNPAA0",
  "DiagBinder__c": "a8009000000boTeAAI",
  "Knowledge__c": "ka109000000olFxAAI",
  "ResearchState__c": "In verification"
}];

var nData = [{
  "Id": "ka109000000ors1AAA"
}, {
  "Id": "ka109000000oq3ZAAQ"
}, {
  "Id": "ka109000000oiqdAAA"
}, {
  "Id": "ka109000000oiqDAAQ"
}, {
  "Id": "ka109000000oir9AAA"
}, {
  "Id": "ka109000000oiqCAAQ"
}];

const articleList = nData.map(article => data.find(item => item.Knowledge__c == article.Id) ? { ...article, icon: 'Non bin' } : { ...article, icon: 'bin'});

console.log(articleList);