Я пытаюсь получить значения из следующего объекта. Цикл for работает в одном из объектов, но не работает в другом объекте javascript. Мне было интересно, какая разница и как я могу заставить его работать на другом объекте?

Объект 1:

var objects = [
  {
    "foo" : "bar",
    "bar" : "sit"
  },
  {
    "foo" : "lorem",
    "bar" : "ipsum"
  }
];

Объект 2:

{
"4dd5a49e366": {
"name" : "bar",
"bar" : "sit",
"date": "2016-08-03T04:48:04.283Z"
},
"519c5056af2": {
"name" : "lorem",
"bar" : "ipsum",
"date": "2016-09-03T04:48:04.283Z"
}
}

Я хочу выполнить поиск элементов, имя атрибута которых совпадает с некоторым параметром search_term. И вернуть предметы.

Вот поиск петли использую.

function searchFor(toSearch) {
      var results = [];
      toSearch = trimString(toSearch); // trim it
      for(var i=0; i<objects.length; i++) {
        for(var i in objects[i]) {
          if(objects[i][key].indexOf(toSearch)!=-1) {
            if(!itemExists(results, objects[i])) results.push(objects[i]);
          }
        }
      }
      return results;
    }
   console.log(searchFor('o'));

Это работает для первого объекта, а не для второго. Как я могу заставить его работать на секунду?

0
Ericel 4 Сен 2016 в 07:01

2 ответа

Лучший ответ

Первая переменная - это массив объектов. Поскольку это массив, вы можете использовать все методы массива.

Второй - это объект с ключами 4dd5a49e366 и 519c5056af2, которые, в свою очередь, снова являются объектами и имеют несколько свойств.

Вы не можете использовать методы массива для этого второго объекта

как я могу заставить его работать в другом объекте?

Надеюсь, этот фрагмент будет полезен

var myObject = {
  "4dd5a49e366": {
    "name": "bar",
    "bar": "sit",
    "date": "2016-08-03T04:48:04.283Z"
  },
  "519c5056af2": {
    "name": "lorem",
    "bar": "ipsum",
    "date": "2016-09-03T04:48:04.283Z"
  }
}
// a function to accept the name value
function findByName(name) {
  var thisObject = "";
  for (var keys in myObject) { // looping over objects
    var getThisObject = myObject[keys];
    if (getThisObject.name === name) { // Checking if name matches
      thisObject = myObject[keys]; // assigning the object to a variable
    }
  }
  return thisObject // return that variable
}
var getMyObject = findByName('bar');
console.log(getMyObject)

JSFIDDLE

ИЗМЕНИТЬ

если я введу, просто найдитеByName ('b'); он должен вернуть результаты, которые полное имя

Вам нужно использовать indexOf, чтобы узнать, содержит ли это значение имени определенный символ.

Используйте массив для хранения всех соответствующих объектов, где значение имени содержит этот конкретный символ. Возвратите этот массив из функции.

function findByName(name) {
  var thisObject = [];
  for (var keys in myObject) {
    var getThisObject = myObject[keys];
    if (getThisObject.name.indexOf(name)!==-1) {
      thisObject.push(myObject[keys]);
    }
  }
  return thisObject
}
var getMyObject = findByName('b');

JSFIDDLE 2

1
brk 4 Сен 2016 в 05:40

Я предлагаю вам немного почитать об объектных литералах JavaScript и массивах. Первый пример - массив объектов. Второй просто объект. Две совершенно разные структуры данных.

1
Ju66ernaut 4 Сен 2016 в 04:05